使用merge()方法可高效合并Map,通过BiFunction处理键冲突。若key不存在则直接插入;存在时执行remappingFunction,如Integer::sum实现值相加。示例中map1合并map2后:"a"→1,"b"→5,"c"→4。支持多种策略:Math::max保留大值,字符串拼接用(oldVal, newVal)->oldVal+","+newVal,List合并则新建列表并添加所有元素。注意:返回null将删除键;操作修改原Map,需复制以保留原数据;并发环境推荐ConcurrentHashMap,其merge线程安全。该方法适用于统计、聚合场景,使代码更简洁高效。

在Java中,合并两个或多个Map是常见的操作。使用merge()方法可以高效地处理键冲突并实现自定义的值合并逻辑。这个方法属于Map接口,特别适用于需要对重复键的值进行聚合(如累加、拼接等)的场景。
merge() 方法基本语法
merge(K key, V value, BiFunction super V,? super V,? extends V> remappingFunction)
该方法的作用是:
- 如果当前Map中没有指定的key,直接插入key-value。
- 如果key已存在,则调用remappingFunction来决定新值:它接收旧值和传入的新value,返回最终要存储的值。
合并两个Map的常用方式
虽然merge()是Map实例的方法,但通常我们结合循环来将一个Map的内容合并到另一个中。以下是一个典型示例:
立即学习“Java免费学习笔记(深入)”;
Mapmap1 = new HashMap<>(); map1.put("a", 1); map1.put("b", 2); Map map2 = new HashMap<>(); map2.put("b", 3); map2.put("c", 4); // 将map2合并到map1中,相同key的值相加 for (Map.Entry entry : map2.entrySet()) { map1.merge(entry.getKey(), entry.getValue(), Integer::sum); }
执行后结果为:
"a" → 1,
"b" → 5(2 + 3),
"c" → 4
这里使用了Integer::sum作为合并函数,你也可以写成(x, y) -> x + y。
使用 merge 实现其他合并策略
除了数值相加,还可以根据需求自定义合并行为:
-
保留较大值:
map1.merge(key, value, Math::max) -
字符串拼接:
map1.merge(key, value, (oldVal, newVal) -> oldVal + "," + newVal) -
合并List类型值:
Map
> map1 = new HashMap<>(); // 初始化map1中的list... map2.forEach((key, value) -> map1.merge(key, value, (list1, list2) -> { List result = new ArrayList<>(list1); result.addAll(list2); return result; }) );
注意事项与建议
使用merge()时需注意:
- 若remappingFunction返回
null,则该key会被从Map中移除。 - 操作的是可变Map,原Map内容会被修改。如需保留原Map,应先复制一份再合并。
- 对于并发环境,考虑使用
ConcurrentHashMap,其merge()方法是线程安全的。
基本上就这些。合理利用merge()能让Map合并更简洁、高效,尤其适合统计、累加类业务场景。









