在我学习 Java 8 forEach 的过程中,我尝试更改此代码:
Integer counter;
for(String s : stringList) {
counter = myMap.get(s);
if(counter == null) {
myMap.put(s, 1);
}
else {
myMap.put(s, counter + 1);
}
}
如您所见,这个想法是,如果 String 不存在,则将其添加为键并将值设置为 1。 当 key 存在时,counter 等于最新值,然后将 value 替换为 counter + 1。
我试过这个:
stringList.forEach(s-> myMap.putIfAbsent(s,1));
但这只是完成了一半的工作。
我知道存在诸如 computeIfAbsent 和 computeIfPresent 之类的方法,但是在键之后,需要一个函数,但我不确定是什么。不能更改 counter 的值,因为它应该是最终的。好像没有 putIfPresent...
是否可以使用 forEach 和 lambda 表达式来做到这一点,还是我应该保持这样?
最佳答案
您可以在 map 上使用merge
功能。它需要一个键、一个值和一个函数,如果键之前存在,该函数将被调用。
你可以这样使用它:
stringList.forEach(s -> myMap.merge(s, 1, (oldValue, newValue) -> oldValue + 1));
如果您想删除 key ,您也可以从 lambda 返回 null
。
这里有完整的文档:
关于java - 使用 foreach 添加重复的字符串键以进行映射,其中值是重复次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40672771/