我正在尝试更新顶级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