Java 8流 - 合并一个Map列表

12

我正在尝试使用一个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()),所以也许我走对了方向,只需要在此之前弄清楚如何合并它们,而不会破坏结果。
提前感谢您的帮助。
1个回答

21

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

2
比我最初发布的要简单得多。 - rgettman

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