我正在尝试使用List<Map<String, Integer>>
的流将所有包含的地图合并为一个。这是为了将多个请求响应聚合为一个。
考虑这个数据集(使用JSON使其更易于阅读):
[
{"field1": 1, "field2": 5},
{"field2": 6, "field3": 10},
{"field1": 3, "field4": 15}
]
我希望它能产生以下结果(不重要的顺序):
{"field1": 4, "field2": 11, "field3": 10, "field4": 15}
我想将所有键相加并将它们组合成一个地图。使用Java 8中的Stream接口有一个很好的方法吗?
我发现Collectors.groupingBy(o -> o, Collectors.counting())
,所以也许我在正确的路线上,我只需要弄清楚如何在没有搞砸结果的情况下实际合并它们。
提前致谢。
答案 0 :(得分:13)
counting()
将返回按您为每个键应用的函数分组的值的数量。如果要对它们求和,那么您要查找的下游收集器是summingInt
(如果您可能有溢出,则为summingLong
):
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingInt;
...
Map<String, Integer> map =
list.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, summingInt(Map.Entry::getValue)));