使用Lambda表达式填充Map实现词频统计的语法问题求助
解决单词统计的Lambda表达式问题
嘿,我来帮你修正这个单词统计的Lambda代码!先说说你当前代码的问题:
你用了computeIfAbsent,但这个方法的作用仅仅是当键不存在时,才会执行第二个参数的函数来生成默认值——如果键已经存在,这个函数根本不会触发,所以完全没法实现“已存在则值加1”的逻辑。而且你写的(w) -> (new Integer(1) + 1).intValue()还会返回2,就算新增键也会把值设成2,完全不符合预期。
下面给你两种正确的实现方式,都是用Lambda完成单词统计的需求:
方法1:使用Map.compute()
这个方法可以同时处理键存在和不存在的情况,逻辑清晰:
Consumer<String> wordCount = word -> map.compute(word, (key, currentValue) -> currentValue == null ? 1 : currentValue + 1 );
- 当
currentValue为null(单词第一次出现),就返回1作为初始值; - 当
currentValue不为null(单词已存在),就返回currentValue + 1完成累加。
方法2:使用Map.merge()(更简洁)
merge是专门处理这种“新增或累加”场景的方法,代码更紧凑:
Consumer<String> wordCount = word -> map.merge(word, 1, Integer::sum);
- 第一个参数是要统计的单词(键);
- 第二个参数是初始值1(单词第一次出现时存入的值);
- 第三个参数是
Integer::sum,表示当键已存在时,把旧值和1相加,用结果更新映射。
这两种方式都能完美实现你想要的“不存在则存1,已存在则加1”的逻辑,选哪个都可以,merge写法更简洁推荐优先用~
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

