2016-09-18 56 views
0

鑑於番石榴不可改變的表,我需要處理所有單元和並篩選出此基礎上返回的Java可選一些映射結果一些細胞,收集可選項目

immutbleTable.cellSet() 
      .parallelStream() 
       .map(cell -> processAndGetOptionalResult(cell)) 
       .filter(cell -> cell.isPresent()) 
       .map(cell -> cell.get()) 
       .collect(Collector.of(
         ImmutableTable.Builder::new, 
         ImmutableTable.Builder::put, 
         (l, r) -> l.putAll(r.build()), 
         ImmutableTable.Builder<String,String,String>::build) 
      ); 
    } 

有沒有更好的方式來實現這一目標?有沒有一種方法可以刪除「map(cell - > cell.get())」並通過accumulator自身收集cell.get()?

回答

2

您可以將Optional的處理融入Collector

resultTable = immutableTable.cellSet().parallelStream() 
    .map(cell -> processAndGetOptionalResult(cell)) 
    .collect(Collector.of(
      ImmutableTable.Builder::new, 
      (b,o) -> o.ifPresent(b::put), 
      (l, r) -> l.putAll(r.build()), 
      ImmutableTable.Builder<String,String,String>::build) 
    ); 

該工程進展順利的累加器函數表示動作和執行動作(如果不爲空)是的典型使用案例一一個Optional,不像isPresent - get序列。

3

除了使用方法參考:

immutbleTable.cellSet() 
     .parallelStream() 
      .map(this::processAndGetOptionalResult) 
      .filter(Optional::isPresent) 
      .map(Optional::get) 
      .collect(Collector.of(
        ImmutableTable.Builder::new, 
        ImmutableTable.Builder::put, 
        (l, r) -> l.putAll(r.build()), 
        ImmutableTable.Builder<String,String,String>::build) 
     ); 
} 

答案是沒有 - 在當前(JDK 8)API有沒有更好的方式來實現這一目標。在JDK 9 Optional將具有.stream()方法,這將允許使用一個操作 - flatMap

immutbleTable.cellSet() 
     .parallelStream() 
      .map(this::processAndGetOptionalResult) 
      .flatMap(Optional::stream) 
      .collect(Collector.of(
        ImmutableTable.Builder::new, 
        ImmutableTable.Builder::put, 
        (l, r) -> l.putAll(r.build()), 
        ImmutableTable.Builder<String,String,String>::build) 
     ); 
} 

For more details see this answer