Map.merge() 方法适合词频统计,可避免手动判空、取值、累加,代码简洁且配合 ConcurrentHashMap 时线程安全;其核心用法为 merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)。

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<String> words):
Map<String, Integer> freq = new HashMap<>(); words.forEach(word -> freq.merge(word, 1, Integer::sum));
每遇到一个单词,就尝试把它和 1 合并;若不存在则设为 1,若已存在则旧值 + 1。
立即学习“Java免费学习笔记(深入)”;
将 LaTeX(.tex)学术论文转换为 Word(.docx),支持可编辑的 OMML 公式、原生 Word 表格、嵌入图形、IEEE 双栏排版及参考文献
多文档合并统计(一行搞定)
多个文档的词列表(List<List<String>> docs),可 flatMap 后统一 merge:
Map<String, Integer> totalFreq = new HashMap<>();
docs.stream()
.flatMap(List::stream)
.forEach(word -> totalFreq.merge(word, 1, Integer::sum));
也可用 Collectors.toMap 实现函数式写法(但不如 forEach 直观):
Map<String, Integer> totalFreq = docs.stream()
.flatMap(List::stream)
.collect(Collectors.toMap(
word -> word,
word -> 1,
Integer::sum
));
并发场景:多线程处理文档
用 ConcurrentHashMap + merge 天然线程安全:
Map<String, Integer> freq = new ConcurrentHashMap<>();
docs.parallelStream()
.flatMap(List::stream)
.forEach(word -> freq.merge(word, 1, Integer::sum));
注意:parallelStream 中使用 forEach 是无序的,但 merge 操作本身是原子的,结果正确。
不复杂但容易忽略:merge 是 Map 接口方法,所有实现类(HashMap、ConcurrentHashMap、TreeMap)都支持,无需额外依赖。

















