在我学习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。 当密钥存在时,counter等于最新值,然后用counter + 1替换该值。
我试过了:
stringList.forEach(s-> myMap.putIfAbsent(s,1));
但这只占了工作的一半。
我知道像computeIfAbsent和computeIfPresent这样的方法存在,但是在键之后,需要一个函数,但我不确定是什么。无法将值更改为计数器,因为它应该是最终的。好像没有putIfPresent ......
是否可以使用forEach和lambda表达式执行此操作,还是应该保持这样?
答案 0 :(得分:3)
您可以在地图上使用merge
功能。它需要一个键,一个值和一个函数,如果密钥存在,它将被调用。
你可以像这样使用它:
stringList.forEach(s -> myMap.merge(s, 1, (oldValue, newValue) -> oldValue + 1));
如果要删除密钥,也可以从lambda返回null
。
此处提供完整文档:
答案 1 :(得分:2)
您可以简单地重复使用原始代码。只需在lambda中移动计数器的声明:
strings.forEach(s -> {
Integer counter = myMap.get(s);
if (counter == null) {
myMap.put(s, 1);
}
else {
myMap.put(s, counter + 1);
}
});