java - ConcurrentHashMap JDK 8 何时使用 computeIfPresent

标签 java multithreading concurrency concurrenthashmap

jdk 8新版Concurrent Hash Map新增了两个Method。

computeIfAbsent

computeIfPresent

putIfAbsent - 旧方法

我了解 putIfAbsentcomputeIfAbsent 的用例。 但我不确定何时会使用 computeIfPresent。 如果我现在有 computeIfPresent,为什么还需要 putIfAbsent。 putIfAbsent 会创建至少一个额外的值实例。

仅仅是为了向下兼容吗?

最佳答案

正如另一个答案中提到的:为了向后兼容,将始终保留方法,即使引入了新的、更“强大”的方法也是如此。

关于 computeIfPresent 的用例:可能很难找到一个小到看起来不做作但仍然令人信服的例子。通常,此方法的目的是更新任何形式的现有值。

一个示例可以是(受限的)单词计数:对于一组给定的单词,在 map 中存储初始计数 0。然后,处理一系列单词:每当从初始集合中找到一个单词时,它的计数就会增加 1:

import java.util.LinkedHashMap;
import java.util.Map;

public class ComputeIfPresentExample 
{
    public static void main(String[] args) 
    {
        Map<String, Integer> wordCounts = new LinkedHashMap<String, Integer>();

        String s = 
            "Lorem ipsum dolor sit amet consetetur iam nonumy sadipscing " + 
            "elitr, sed diam nonumy eirmod tempor invidunt ut erat sed " + 
            "labore et dolore magna dolor sit amet aliquyam erat sed diam";

        wordCounts.put("sed", 0);
        wordCounts.put("erat", 0);

        for (String t : s.split(" "))
        {
            wordCounts.computeIfPresent(t, (k,v) -> v+1);
        }
        System.out.println(wordCounts);
    }
}

(当然,像这样的事情可以用不同的方式解决,但这是一个相当频繁的任务,以一种或另一种形式,新方法允许一个相当简洁和优雅的解决方案)

关于java - ConcurrentHashMap JDK 8 何时使用 computeIfPresent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24872531/

相关文章:

python - Django 中的简单线程

java - Java中如何让线程并发运行

java - LongAccumulator 是如何实现的,使其更高效?

concurrency - 防止并发执行

java - 删除元素后从头开始检查 arraylist

java - 将对象转换为 json 时覆盖属性名称

java - C# 相当于 Java 的同步 (abc.class)

java - 如何解决 Future<CAP#1> 无法转换为 Future<Void> 的问题?

Javafx - 同步延迟 - 卡片翻转

java - 在 JAVA 5 中生成规范 XML 的库?