Collections 中级

使用 compute 和 merge 原子更新映射

用 computeIfAbsent()、compute() 和 merge() 替代多步骤的映射查找与修改。

✕ Manual lookup and update
List<String> values = groups.get(key);
if (values == null) {
    values = new ArrayList<>();
    groups.put(key, values);
}
values.add(value);
✓ Java 8+
groups.computeIfAbsent(key, ignored -> new ArrayList<>())
        .add(value);
发现此代码有问题? 告诉我们。
⚡

减少查找

避免重复访问键。

🧵

更好的并发语义

并发映射可以原子地执行受支持的更新。

👁

意图清晰

初始化规则紧邻访问操作。

旧方式
get() + null 检查 + put()
现代方式
computeIfAbsent()
自 JDK
8
难度
中级
使用 compute 和 merge 原子更新映射
可用

自 JDK 8 起广泛可用(2014 年 3 月)

Map 计算方法将查找和更新意图合并为一个操作。使用 computeIfAbsent() 进行惰性初始化;当新值取决于现有值时使用 compute();使用 merge() 将给定值与映射中的现有值合并。对于并发映射实现,受支持的计算还能避免分别调用 get() 和 put() 所造成的竞态。