Map of Map,如何更新内部Map的键 Java 8

3

我正在尝试更新顶级Map的值为内部Map的键,为此,我在此提供了3个代码片段,前两个可以正常工作,现在需要理解第三个为什么无法工作。

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

这个不起作用,返回空的Map,不清楚为什么。 在这里,我正在对顶级Map调用collect,并将结果收集到supplier HashMap :: new中,在累加器中,我正在对内部map调用另一个collect并将其收集到TreeMap中,现在我期望累加器输出使用提供的HashMap :: putAll组合器合并到顶级Map中。

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

throwingMerger是什么,你的结果数据结构是什么?而且你最后的方法忽略了内部collect(流)操作的结果。你当前的操作看起来就像是使用Map.forEach迭代映射元素一样简单,例如mapOfMap.forEach((ok, ov) -> ov.forEach((ik, iv) -> { ov.merge(ik.getUpdatedKey(), iv, (val1, val2) -> { throw new AlcyoneRuntimeException("Exception in merging, duplicates not allowed."); }); })); - Naman
1个回答

2
你没有处理内部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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接