java里的map的computeIfAbsent方法是什么作用,参数是什么含义
作成日: 2025年5月29日
作成日: 2025年5月29日
java里的map的computeIfAbsent方法是什么作用,参数是什么含义
computeIfAbsent
是 Java 8 为 Map
接口新增的一个默认方法,其作用是在给定的 key 在 Map 中不存在对应值(或对应值为 null
)时,通过指定的映射函数(mappingFunction
)来计算出一个值,并将该值关联到这个 key 上;如果 key 已经有非 null
的映射,则直接返回现有值。
javaV computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
K key
要在 Map 中查询或添加的键。
Function<? super K, ? extends V> mappingFunction
当 key 不存在时,用来根据 key 计算对应值的函数式接口。
apply
方法接收一个 K
(即传入的 key)。V
(将要存入 Map 的值)。检查 map.get(key)
:
null
,则直接返回这个已有值,不会调用 mappingFunction
。null
(包括 key 不存在或显式关联了 null
值),则进入下一步。调用 mappingFunction.apply(key)
:
null
,则往 Map 中 put(key, 返回值)
,并返回这个值。null
,则什么也不放入 Map,并返回 null
。如果 mappingFunction
抛出异常,则异常会被原样抛出,Map 不会被修改。
javaMap<String, List<String>> map = new HashMap<>(); // 假设我们想往每个 key 对应的列表中添加元素: String key = "fruits"; String valueToAdd = "apple"; // 传统写法: if (!map.containsKey(key) || map.get(key) == null) { map.put(key, new ArrayList<>()); } map.get(key).add(valueToAdd); // 使用 computeIfAbsent: map.computeIfAbsent(key, k -> new ArrayList<>()) .add(valueToAdd);
上述 computeIfAbsent
调用中:
key
为 "fruits"
mappingFunction
为 k -> new ArrayList<>()
,当 "fruits"
不存在时会创建一个新的 ArrayList
,并存入 Map,然后返回该列表。线程安全:
HashMap
,computeIfAbsent
并不提供额外的并发安全保障。ConcurrentHashMap
,其 computeIfAbsent
是原子操作,能确保同一个 key 的映射函数不会被多个线程重复执行。返回 null
:
如果 mappingFunction.apply(key)
返回 null
,Map 不会插入任何映射,方法返回 null
。
避免副作用:
映射函数不应有副作用,也不应多次调用相同的 key,避免不必要的性能开销或不一致。
通过 computeIfAbsent
,可以让“如果不存在则创建并返回”的逻辑更简洁、语义更清晰,也能避免多次查找和 put 操作。