computeIfPresent
和 forEach
是 Java 8 中引入的 Stream API 的一部分,用于处理集合中的元素。这两个方法都提供了函数式编程的方式来操作集合数据。
假设你有一个 Map,你想对其中存在的某些键的值进行更新,并且在更新后对所有键值对执行一些操作。
import java.util.HashMap;
import java.util.Map;
public class ComputeIfPresentExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", null);
// 使用 computeIfPresent 更新存在的键的值
map.computeIfPresent("A", (key, val) -> val + 10);
map.computeIfPresent("B", (key, val) -> val * 2);
map.computeIfPresent("D", (key, val) -> val - 5); // 键 "D" 不存在,所以不会有任何变化
// 使用 forEach 遍历并打印所有键值对
map.forEach((key, value) -> System.out.println(key + ": " + value));
}
}
A: 11
B: 4
C: null
computeIfPresent
方法被用来更新键 "A" 和 "B" 的值。"A" 的值增加了 10,而 "B" 的值乘以了 2。键 "D" 不存在于 Map 中,所以调用 computeIfPresent
对它没有任何影响。forEach
方法遍历 Map 中的所有键值对,并打印它们。注意,即使 "C" 的值为 null,forEach
也会处理这个键值对。computeIfPresent
时,如果提供的函数返回 null,那么该键将从 Map 中移除。forEach
时,如果对集合进行了结构性修改(除了通过迭代器自身的 remove 方法),可能会抛出 ConcurrentModificationException
。如果你在使用 computeIfPresent
后遇到问题,比如键值没有按预期更新,你应该检查提供的重映射函数是否正确实现,并且确保键确实存在于 Map 中。如果在使用 forEach
时遇到并发修改异常,你可以考虑使用并发集合类,如 ConcurrentHashMap
,或者在迭代时使用显式的锁来避免并发修改。
通过这种方式,你可以有效地结合使用 computeIfPresent
和 forEach
来处理和操作集合数据。
云+社区沙龙online第5期[架构演进]
北极星训练营
企业创新在线学堂
高校公开课
高校公开课
云+社区沙龙online第5期[架构演进]
腾讯云数据湖专题直播
腾讯云Global Day LIVE
云+社区技术沙龙[第21期]
一体化监控解决方案
领取专属 10元无门槛券
手把手带您无忧上云