Map
をJava 8 Stream
とインターフェイスでConcurrentHashMap
に変換したい場合、2つのオプションがあります。Collectors.toConcurrentMapとCollectors.toMapサプライヤオプションを使用してMapをConcurrentHashMapに変換する違いは何ですか?
最初:
Map<Integer, String> mb = persons.stream()
.collect(Collectors.toMap(
p -> p.age,
p -> p.name,
(name1, name2) -> name1+";"+name2,
ConcurrentHashMap::new));
そして第二:
1がより良い選択肢であるMap<Integer, String> mb1 = persons.stream()
.collect(Collectors.toConcurrentMap(
p -> p.age,
p -> p.name));
?各オプションはいつ使うべきですか? toMap
さんのJavadocから
ストリームがパラレルでないと別のことが起こりますか?差異だけ私はCollectorImplに特性フラグを追加するだけで、そのフラグ(挿入順)に基づいて評価しますが、並列ストリームでない場合は両方のメソッドが同じ動作をしますが、HashMapはConcurrentHashMapを生成します。ストリームの振る舞いはそのパラレルの場合。 –
@Bolzanoをパラレルストリームで使用すると、どちらの実装でもCombinerが呼び出されません。マージはアキュムレータ(あなたが持っている多くの要素と呼ばれ、サプライヤは一度だけ呼び出されます)で実行されます。だから、唯一の目に見える違いは、得られる結果です:HashMapとConcurrentHashMapです。 HashMap :: mergeを呼び出し、toConcurrentMapはConcurrentHashMap :: mergeを呼び出します。したがって、シリアル処理を行っている場合、なぜConcurrentHashMapが必要なのでしょうか? – Eugene
私は@ KaranVermaに質問する必要があります。彼の質問では、彼は並列ストリームを使用していません。私はConcurrentHashMapの値を(スレッドセーフな操作のために)他の時間にキャッシュしようとしていると仮定しています。単純に: "この2コードブロックの違いは何ですか?" –