java - 使用 foreach 添加重复的字符串键以进行映射,其中值是重复次数

标签 java dictionary foreach lambda

在我学习 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

这里有完整的文档:

https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#merge-K-V-java.util.function.BiFunction-

关于java - 使用 foreach 添加重复的字符串键以进行映射,其中值是重复次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40672771/

相关文章:

java - SchedulerFactory 是否能够在启动时为 quartz 创建表?

c++ - 加速的 C++ 头文件不起作用

javascript - 在 JS forEach 方法中包含 if..else... 语句?

javascript - JavaScript 的 forEach 循环如何决定跳过或迭代数组中的 "undefined"和 "null"元素?

ios - 使用 arcgis iOS 经度和纬度显示位置结果不正确

javascript - 在 JavaScript 中正确迭代 object 对象

java - 为 java 类提供用户输入

java - java中删除字符串中的字符

java - 使用 Eclipse 开发 android 应用程序,从布局中删除 header

c# - 使用 LINQ C# 将模型类集合转换为基于属性作为 KEY 的字典