2016-07-26 9 views
0

は、だからここに私のコードです:JavaでCollectors.toMapを使用している場合、新しいマップにエントリを追加するのをどのようにスキップしますか?

HashMap<String, List<Foo.Builder>> strFooMap = new HashMap<>(); 
// add stuff to strFooMap and do other things 
return new HashMap<>(strFooMap.entrySet() 
    .stream() 
    .collect(Collectors.toMap(Entry::getKey, 
     entry -> entry 
      .getValue() 
      .stream() 
      .filter(builder -> { 
       // do some conditional stuff to filter 
      }) 
      .map(builder -> { 
       return builder.build(); 
      }) 
      .collect(Collectors.toList()) 
     ) 
    ) 
); 

だから、時々、filterを行った後、私のList<Foo.Builder>内のすべての項目は除外されます。その後、私の最後のHashMapには、次のようなエントリがあります:{"someStr" -> []}私は値が空リストであるキー値のペアを削除したいと思います。これをどうやってやりますか? .stream().collect(Collectors.toMap(...))コードでこれを行うことは可能でしょうか?ありがとう!

+2

「Foo.Builder」メソッドや戻り値の型などの情報を追加してください。また、なぜ返されたマップを別の 'HashMap'にコピーしていますか? – shmosel

+2

収集する前にフィルタリングしますか? – Tunaki

答えて

2

解決策の1つは、結果をマップする前に値の変換を移動することです。空の値をフィルタリングする可能性を与えます。

List<Foo> transformValue(List<Foo.Builder> value) { 
    //original value transformation logic 
} 

<K,V> Entry<K,V> pair(K key, V value){ 
    return new AbstractMap.SimpleEntry<>(key, value); 
} 

strFooMap.entrySet().stream() 
     .map(entry -> pair(entry.getKey(), transformValue(entry.getValue())) 
     .filter(entry -> !entry.getValue().isEmpty()) 
     .collect(toMap(Entry::getKey, Entry::getValue)); 
+0

私はかなりJava(特にラムダ)の新機能ですが、中間部分の意味を簡単に説明できますか?これはKey、Valueを返す汎用クラスですか? –

+2

'pair'は、Map.Entry オブジェクトを作成するヘルパー関数です。 Entryはジェネリックであるので、私はこの関数も汎用的に作成しました。ドキュメントのジェネリックの詳細https://docs.oracle.com/javase/tutorial/java/generics/types.html –

関連する問題