如何合并多个哈希映射也对java中相同键的值求和

2022-09-03 03:41:45

ı am试图合并多个哈希映射也对同一键的值求和,ı想用玩具示例解释我的问题,如下所示

    HashMap<String, Integer> m = new HashMap<>();
    HashMap<String, Integer> m2 = new HashMap<>();

    m.put("apple", 2);
    m.put("pear", 3);
    m2.put("apple", 9);
    m2.put("banana", 6);

ı tried putall

m.putAll(m2);

输出如下 {香蕉=6, 苹果=9, 梨=3}

但是对于这个问题,它的结果是不正确的。ı 想要输出为

{香蕉=6,苹果=11,梨=3}

ı 如何在 java 中得到这个结果?


答案 1

如果您使用的是 Java 8,则可以使用 Map 的新合并方法。

m2.forEach((k, v) -> m.merge(k, v, (v1, v2) -> v1 + v2));

答案 2

这是Java 8流的一个非常好的用例。您可以连接条目流,然后将其收集到新地图中:

Map<String, Integer> combinedMap = Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
    .collect(Collectors.groupingBy(Map.Entry::getKey,
             Collectors.summingInt(Map.Entry::getValue)));

这个解决方案有很多优点,包括能够使其并行,扩展到任意数量的地图,以及能够根据需要轻松过滤地图。它也不需要原始映射是可变的。