2017-06-08 8 views
2

私はJavaで最終的なConcurrentMapを持っており、新しいものを作成せずにその要素をフィルタしたいと思っています。フィルタJavaのコレクションでラムダを作成せずに新しいものを作成

質問:ラムダの中からコレクション()を参照できますか?

final ConcurrentMap<String, String> people = new ConcurrentHashMap<>(); 
people.put("Sam", "developer"); 
people.put("Kate", "tester"); 

people.forEach((name, role) -> { 
    if (name.length() > 3) 
     people.remove(name); 
}); 

答えて

3

.keySet().values()、および.entrySet()それぞれのマップのキー、値とエントリのライブビューを返します。あなたはそれらのコレクションから要素を削除することができ、対応するエントリをマップから削除されます。

people.keySet().removeIf(name -> name.length() > 3); 
3

これは一種の例hereため、つい最近議論されています。

ドキュメントはフェイルファストトラバーサルとは対照的に、CHMは、トラバーサル弱一貫性を提供することを述べています。これが何を意味するのかhere見られるように:

を彼ら他の操作と並行し

を進めるそれらが正確に一度構築時に存在した要素をトラバースすることが保証されて、そしては(ただし保証されていません)構築後の変更を反映する

一般に、CHMの構造体を変更する操作はスレッドセーフですが、達成したいことはStreamドキュメントではまだ推奨されません。これは干渉と呼ばれ、避けるべきです。その構造を単純な0​​で変更すると、移動中にソースを変更するため、ConcurrentModificationExceptionが得られます。以前のマップを破棄しないという魅力的な理由がない限り、興味のある値をフィルタリングしてそれらを収集するだけです。

また、を追加すると、上記のリンクからCMHにどのように予期しない結果が得られるかがわかります。

関連する問題