【问题标题】:Java 8 streams - merging a list of MapsJava 8 流 - 合并地图列表
【发布时间】:2015-07-31 17:06:33
【问题描述】:

我正在尝试使用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()),所以也许我在正确的路线上,我只需要在不搞砸结果的情况下提前弄清楚如何实际合并它们。

提前致谢。

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

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

    【讨论】:

    • 比我最初发布的要简单得多。
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2018-04-17
    • 2017-03-02
    相关资源
    最近更新 更多