2016-09-01 6 views
-2

は不変tofilterTable グアバのImmutableTableフィルタリング

並列ストリームを介しグアバのImmutableTableをフィルタリングして、コレクタ助けが必要です。

Usecase:validEntryテーブルに存在しない要素またはエントリ値を削除して、toFilterに反復して削除します。 forループを介して、それを行うの 伝統の道:

ImmutableTable<MarketplaceArc, String, ObjectB> filterInactive(final ImmutableTable<MarketplaceArc, String, ObjectB> toFilter) { 

    final ImmutableTable.Builder filteredResultBuilder = 
      ImmutableTable.builder(); 

    final Map<MarketplaceArc, Map<String, ObjectB>> rowMap = 
    browseMappings.rowMap(); 

    for (final Map.Entry<MarketplaceArc, Map<String, ObjectB>> 
     rowMapEntry : rowMap.entrySet()) { 

     for (final Map.Entry<String, ObjectB> entry : 
      rowMapEntry.getValue().entrySet()) { 

      if(ifActive(rowMap.getKey, entry)){ 
      filteredResultBuilder.put(
        rowMapEntry.getKey(), 
        entry.getKey(), 
        buildObjectB(entry)); 
       } 
     } 
    } 
    return filteredResultBuilder.build(); 
} 

は、より良いとJava parallelStreams経由でこれを行うための簡潔な方法はありますか?

+1

あなたの質問を修正します。あなたの例は、 ImmutableTable'はい; 'ImmutableTable'はフィールド*名前*ではなくオブジェクト型です)。擬似コードではなく、実際のコードで動作します。だからあなたが持っているもので[MCVE](http://stackoverflow.com/help/mcve)を作成し、私たちがあなたを助けるために期待していることを正確に教えてください。 –

+0

修正しました。私はいくつかの指針を探していた。 – sidss

答えて

0

はい、できます。 Table.Cellを使用できます。このようにして、2つのループを1つに減らします。述語を使ってメソッドをより一般的にすることさえできます。

あなたのアプリはJava 8用であると書いてあることがわかりましたが、はJava 8向けにはあまりうまく設計されていないため、Java 8ストリームやクールなものでは不可能ですCellのItera {ble、tor}からテーブルを構築できません;テーブルはBiPredicateではなくTriPredicateを必要としません)。だから、あなたのコードをプレーンとベーシックに改良しましょう。 Table

用に最適化さ

昔ながらのループは、だからここに基本的なバージョンです。実際には特別なことはありませんが、複雑な中間データ構造に依存しないため、より良い方法で作業を行います(たとえば、このソリューションではマップを使用し続けることはありません)。述語

より一般的な解決策と

ImmutableTable<MarketplaceArc, String, ObjectB> filterInactive(Table<MarketplaceArc, String, ObjectB> unfiltered) { 
    ImmutableTable.Builder<MarketplaceArc, String, ObjectB> filtered = ImmutableTable.builder(); 
    for (Table.Cell<MarketplaceArc, String, ObjectB> cell: unfiltered.cells()) { 
    if (isActive(cell.getRow(), cell.getValue())) { 
     filtered.put(cell); 
    } 
    } 
    return filtered.build(); 
} 

汎用ソリューションは、一般的なフィルタリング方法を有することです。どのようなJava 8の魔法のおかげで、あなたのコードをより読みやすくします:

// Generic method. 
<R,C,V> ImmutableTable<R,C,V> filterToImmutable(Table<R,C,V> unfiltered, Predicate<Table.Cell<R,C,V>> predicate) { 
    ImmutableTable.Builder<R,C,V> filtered = ImmutableTable.builder(); 

    // Actually, let's use some Java 8, just because we can! 
    unfiltered.cells().parallelStream() 
     .filter(predicate) 
     .foreach(filtered::put); 
    return filtered.build(); 
} 

// Specific predicate 
boolean isActiveCell(Table.Cell<MarketplaceArc, String, ObjectB> cell) { 
    return isActive(cell.getRow(), cell.getValue()); 
} 

// Use all you've written, with some Java 8, just because we can. Again. 
ImmutableTable<MarketplaceArc, Map<String, ObjectB> unfiltered = ... ; 
ImmutableTable<MarketplaceArc, Map<String, ObjectB> filtered = filterToImmutable(unfiltered, this::isActiveCell); 
+0

hmmm ...私は間に 'buildObjectB'を忘れているように見えます。さて、各ソリューションでそうするのは簡単です。あなたの名前付けに気を取られてしまったので(あなたのメソッドは 'filterXxx'と呼ばれますが、それも変換されます...)、' buildObjectB'のために 'Tables.transformValues'を使っていつでも変換できます。 –

関連する問題