Vipin:
私はこのために私はここで最初の2が動作し、第三1が動作していない理由を理解しようとしている3つのコードスニペットを与えている、トップレベル地図の値である内部Mapの更新キーにしようとしています。
これはmapOfMap変数の構造であり、分類キーの値は、実際のクラスに置き換えることができます。
Map<TopLevelMapKey, Map<InnerMapKey, InnerMapValue>> mapOfMap;
これは最初のバージョン罰金の作品です。
mapOfMap
.entrySet()
.stream()
.forEach(topMap -> map
.put(topMap.getKey(),
topMap.getValue()
.entrySet()
.stream()
.collect(Collectors.toMap(
innerMapEntry -> innerMapEntry.getKey().getUpdatedKey, Map.innerMapEntry::getValue,
(v1, v2) -> {
throw new RuntimeException(" Exception in merging, duplicates not allowed.");},
TreeMap::new))));
また、これは罰金を動作しますが、おそらく最良の方法ここでは、第二版です。
mapOfMap
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
topMap -> topMap.getValue()
.entrySet()
.stream()
.collect(Collectors.toMap( innerMapEntry -> innerMapEntry.getKey().getUpdatedKey,
Map.Entry::getValue,
v1, v2) -> {
throw new RuntimeException(" Exception in merging, duplicates not allowed.");},
TreeMap::new ))
));
この1つは働いていない、それは理由を理解することはできません、空のMapを返します。これで私は、トップレベルの地図上で収集呼び出していますし、サプライヤーのHashMapで結果を収集::新しい、アキュムレータに私はTreeMapの中に集めていますインナーマップ上でより多くのコレクト1を呼び出しています、今私は、アキュムレータの出力は、トップレベルの地図で結合されることを期待しますHashMapを使用して::のputAllコンバイナが提供。
mapOfMap
.entrySet()
.stream()
.collect(HashMap::new,
(hashMap, topMap) ->
topMap.getValue()
.entrySet()
.stream()
.collect( TreeMap::new,
(treeMap, innerMap) -> treeMap.put(innerMap.getKey().getUpdatedKey, innerMap.getValue()),
TreeMap::putAll),
HashMap::putAll);
サミュエル・フィリップ:
あなたは、内側の戻り値を無視していますcollect()
。あなたは、与えられた中でそれを置く必要がありますhashMap
値:
mapOfMap.entrySet().stream()
.collect(HashMap::new,
(hashMap, topMap) -> {
TreeMap<TopLevelMapKey, InnerMapValue> value = topMap.getValue()
.entrySet().stream()
.collect(TreeMap::new,
(treeMap, innerMap) -> treeMap.put(innerMap.getKey().getUpdatedKey(), innerMap.getValue()),
TreeMap::putAll);
hashMap.put(topMap.getKey(), value);
},
HashMap::putAll);