gpt4 book ai didi

java - 如何使用流合并 map 集合

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:17:09 29 4
gpt4 key购买 nike

我有一组 map :

Collection<Map<String,Double>> myCol = table.values();

我想把它转换成 map

Map<String, Double>

这样,对于匹配的键,值被汇总。使用 for 循环,这很简单:

Map<String, Double> outMap = new HashMap<>();
for (Map<String, Double> map : myCol) {
outMap = mergeMaps(outMap, map);
}

mergeMaps()定义为

mergeMaps(Map<String, Double> m1, Map<String, Double> m2){    
Map<String, Double> outMap = new TreeMap<>(m1);
m2.forEach((k,v) -> outMap.merge(k,v,Double::sum)); /*sum values if key exists*/
return outMap;
}

但是,我想使用流从集合中获取 map 。我试过如下:

Map<String, Double> outMap = new HashMap<>();    
myCol.stream().forEach(e-> outMap.putAll(mergeMaps(outMap,e)));
return outMap;

这没有问题。但是,我还能改进它吗?我的意思是,如何在其中使用收集器?

最佳答案

根据您的输入,您可以获取 map 流,然后将其平面化为 Stream<Map.Entry<String, Double>> .从那里,您将它们收集到一个新映射中,指定您想要对映射到同一键的值求和。

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingDouble;
import static java.util.stream.Collectors.toMap;

....

Map<String, Double> outMap =
myCol.stream()
.flatMap(m -> m.entrySet().stream())
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, Double::sum));

或者,您可以使用 groupingBy而不是 toMap :

.collect(groupingBy(Map.Entry::getKey, summingDouble(Map.Entry::getValue)));

关于java - 如何使用流合并 map 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47334245/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com