当get()返回null时,如何原子地创建一个值并将其存储在哈希图中?



我想要的是,如果一个键已经在hashmap中,那么返回它的值,否则创建一个新值,将其与指定的键关联,然后返回它。

我发现ConcurrentHashMap中compute()的方法可以解决这个问题。令人沮丧的是,它需要 API 24。 还有其他选择吗?

调用需要 API 级别 24(当前最小值为 16(:java.util.concurrent.ConcurrentHashMap#compute

这是我的第一篇文章,我很抱歉我的英语不好。

Data data = mConcurrentHashMap.compute("c:/directory/data", new BiFunction<String, Data, Data>() {
@Override
public String apply(String key, Data oldValue) {
if (oldValue != null) {
return oldValue;
} else {
return new Data();
}
}
});

compute方法只是更改映射中的值,但以更"功能",有时更简洁的方式进行。

你的代码基本上是这样的,没有任何Java 8的东西:

String oldValue = mConcurrentHashMap.get("c:/directory/data");
mConcurrentHashMap.put(
"c:/directory/data",
oldValue != null ? oldValue : new Data()
);

万一你决定使用Java 8,你可以更简洁地做到这一点:

mConcurrentHashMap.compute("c:/directory/data", (key, oldValue) -> Optional.ofNullable(oldValue).orElse(new Data()));

最新更新