map.merge() 方法适合词频统计,可避免手动判空、取值、累加,代码简洁且配合 concurrenthashmap 时线程安全;其核心用法为 merge(k key, v value, bifunction

Java 的 Map.merge() 方法非常适合做词频统计,尤其在处理多文档时能避免手动判空、取值、累加的繁琐逻辑,代码简洁且线程安全(配合 ConcurrentHashMap)。
merge() 的核心用法
merge(K key, V value, BiFunction super V, ? super V, ? extends V> remappingFunction) 三参数含义:
- key:要操作的单词
- value:本次新增的计数(通常是 1)
- remappingFunction:当 key 已存在时,如何合并新旧值(如 `(old, new) -> old + new`)
单文档词频统计(极简版)
假设已分好词(List
Map<string integer> freq = new HashMap(); words.forEach(word -> freq.merge(word, 1, Integer::sum)); </string>
每遇到一个单词,就尝试把它和 1 合并;若不存在则设为 1,若已存在则旧值 + 1。
多文档合并统计(一行搞定)
多个文档的词列表(List<list>> docs</list>),可 flatMap 后统一 merge:
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
Map<string integer> totalFreq = new HashMap();
docs.stream()
.flatMap(List::stream)
.forEach(word -> totalFreq.merge(word, 1, Integer::sum));
</string>
也可用 Collectors.toMap 实现函数式写法(但不如 forEach 直观):
Map<string integer> totalFreq = docs.stream()
.flatMap(List::stream)
.collect(Collectors.toMap(
word -> word,
word -> 1,
Integer::sum
));
</string>
并发场景:多线程处理文档
用 ConcurrentHashMap + merge 天然线程安全:
Map<string integer> freq = new ConcurrentHashMap();
docs.parallelStream()
.flatMap(List::stream)
.forEach(word -> freq.merge(word, 1, Integer::sum));
</string>
注意:parallelStream 中使用 forEach 是无序的,但 merge 操作本身是原子的,结果正确。
不复杂但容易忽略:merge 是 Map 接口方法,所有实现类(HashMap、ConcurrentHashMap、TreeMap)都支持,无需额外依赖。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










