java - 通过对值求和将 map 列表合并为单个 map

标签 java java-8 java-stream

我有一个类值:

public class Values {
    private int count;
    private int values;
}

以及类型为 Map<String, Values> 的多个 map 的列表

Map<String, Values> map1 = new HashMap<>();
        map1 .put("aaa", new Values(1, 10));
        map1 .put("bbb", new Values(5, 50));
        map1 .put("ccc", new Values(2, 30));

Map<String, Values> map2= new HashMap<>();
        map2.put("aaa", new Values(2, 20));
        map2.put("bbb", new Values(3, 50));
        map2.put("ccc", new Values(3, 10));

List<Map<String, Values>> list = Arrays.asList(map1, map2);

可以有任意数量的 map 和 map 中的任意数量的条目,但是 map 的键总是相同的,只有值可以不同。为了清晰起见,我的示例仅包含 2 张 map ,并且每张 map 仅包含 3 个条目。

我想获得一个具有相同键和值对象的单个映射作为对象中每个“计数”和每个“值”的总和,如下所示:

{
        aaa= {
            count = 3,
            value = 30
        },
        bbb= {
            count = 8,
            value = 100
        },
        ccc= {
            count = 6,
            value = 40
        }
    }

我正在尝试使用 Streams API 实现此目的,但我被卡住了:

public static Map<String, Values> mergeMaps(List<Map<String, Values>> maps) {
        return maps.stream()
                .flatMap(m -> m.entrySet().stream()) ...?
    }

如何按键对每个条目进行分组,并将每个计数和每个值加到一个映射中?

提前谢谢你。

最佳答案

您可以使用具有合并功能的 toMap 收集器收集您的 Stream 的条目。

public static Map<String, Values> mergeMaps(List<Map<String, Values>> maps) {
    return maps.stream()
               .flatMap(m -> m.entrySet().stream())
               .collect(Collectors.toMap(Map.Entry::getKey,
                                         Map.Entry::getValue,
                                         (v1,v2) -> new Values(v1,v2)));
}

假设您有一个 Values 构造函数,它采用两个 Values 实例并创建一个具有值之和的实例。

当然,您可以在没有该构造函数的情况下编写合并函数。例如:

(v1,v2) -> new Values(v1.getCount()+v2.getCount(),v1.getValue()+v2.getValue())

关于java - 通过对值求和将 map 列表合并为单个 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54615078/

相关文章:

java流收集函数给出错误

java - 如何以与 List.hashCode() 相同的方式计算流的哈希码

Java Stream,如何检查Map值的长度

java - RxJava : buffer items until some condition is true for current item

java - Android 声明类似于 RadioGroup 的 "for each"

java - 文件打开时的文件 I/O(HTML5 Ogg 直播)

java - 在我的 servlet 中使用 this.variable 访问全局变量的目的是什么?

Java 8 stream API orElse 用法

java - 如何实现用于流式传输斐波那契数的 Spliterator?

java - 使用 Comparator.comparing 对字符串格式的 float / double 列表进行排序