Java 8流 - 合并地图列表

时间:2015-07-31 17:06:34

标签: java java-8 java-stream

我正在尝试使用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 个答案:

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