添加repetead String键以使用foreach进行映射,其中value是重复次数

时间:2016-11-18 08:49:26

标签: 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。 当密钥存在时,counter等于最新值,然后用counter + 1替换该值。

我试过了:

stringList.forEach(s-> myMap.putIfAbsent(s,1));

但这只占了工作的一半。

我知道像computeIfAbsent和computeIfPresent这样的方法存在,但是在键之后,需要一个函数,但我不确定是什么。无法将值更改为计数器,因为它应该是最终的。好像没有putIfPresent ......

是否可以使用forEach和lambda表达式执行此操作,还是应该保持这样?

2 个答案:

答案 0 :(得分:3)

您可以在地图上使用merge功能。它需要一个键,一个值和一个函数,如果密钥存在,它将被调用。

你可以像这样使用它:

stringList.forEach(s -> myMap.merge(s, 1, (oldValue, newValue) -> oldValue + 1));

如果要删除密钥,也可以从lambda返回null

此处提供完整文档:

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

答案 1 :(得分:2)

您可以简单地重复使用原始代码。只需在lambda中移动计数器的声明:

    strings.forEach(s -> {
        Integer counter = myMap.get(s);

        if (counter == null) {
            myMap.put(s, 1);
        }
        else {
            myMap.put(s, counter + 1);
        }
    });