Java中Map.merge()方法用于键值合并:键不存在时直接插入value,存在时通过BiFunction合并新旧值并更新,返回新值或null(触发删除),显著简化计数累加、字符串拼接、取优等场景。

Java 中 Map.merge() 是处理键值累加(如词频统计)最简洁高效的方式,它能避免手动判空、取旧值、计算新值、再 put 的冗余逻辑。
merge 方法的核心逻辑
merge(K key, V value, BiFunction super V, ? super V, ? extends V> remappingFunction) 的行为是:
- 如果 key 不存在:直接放入
(key, value) - 如果 key 已存在:用
remappingFunction合并旧值(oldValue)和传入的 value,结果作为新值存入
关键在于:它把“查—算—存”三步原子化,线程安全(对 ConcurrentHashMap 有效),且代码零判空。
词频统计:一行搞定字符串计数
传统写法需判断 key 是否存在,再做 +1;用 merge 只需一行:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Map<String, Integer> wordCount = new HashMap<>();
List<String> words = Arrays.asList("apple", "banana", "apple", "cherry", "banana", "apple");
words.forEach(word ->
wordCount.merge(word, 1, Integer::sum)
);
// 结果:{apple=3, banana=2, cherry=1}
解释:merge(word, 1, Integer::sum) 表示——若 word 首次出现,设为 1;否则用旧值 + 1。
数值累加:支持任意运算逻辑
不只是加法,所有二元聚合操作都可定制。比如统计销售额总和、求最大单笔金额、甚至拼接字符串:
- 累计求和:
map.merge(key, amount, Integer::sum) - 取最大值:
map.merge(key, newValue, Math::max) - 拼接字符串(用分隔符):
map.merge(key, "item", (old, val) -> old + ", " + val)
注意:第三个参数是函数式接口,可写 lambda 或方法引用,灵活适配业务语义。
与 compute 和 putIfAbsent 对比
对比其他常用方法,merge 在“有则合并、无则插入”场景下最贴切:
-
putIfAbsent(key, defaultValue):只解决“无则设默认”,不处理“有则更新” -
compute(key, (k,v) -> ...):v 可能为 null,需额外判空,不如 merge 语义清晰 -
merge:天然区分“首次”和“非首次”,逻辑直白,不易出错
尤其在流式处理(如 forEach、collect)中,merge 让累加代码真正变得声明式、可读性强。

















