インナー地図のJavaの鍵を更新する方法を、マップのマップ8

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);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=210366&siteId=1