Java 中,putIfAbsent 和 computeIfAbsent 是 java.util.Map 接口的一部分,用于在特定条件下将值插入到 Map 中。这些方法在避免显式的存在检查和减少并发问题时非常有用。本文主要介绍Java中Map的putIfAbsent和computeIfAbsent使用的方法和示例代码。

1、putIfAbsent使用

之前的put方法,只要key存在,value值就会被覆盖,注意put方法返回的是put之前的值,如果无put之前的值,则返回null。putIfAbsent方法,只有在key不存在或者key对应value为null的时候,value值才会被覆盖。

putIfAbsent源代码如下

    default V putIfAbsent(K key, V value) {
V v = get(key);
if (v == null) {
v = put(key, value);
}
return v;
}

使用put()方法实现相同效果,如下代码

if(map.containsKey("kk")&&map.get("kk")!=null) {
map.put("kk", "vv");
}

使用场景:如果我们要变更某个key的值,我们又不知道key是否存在的情况下,而又不需要新增key的情况使用。

2、computeIfAbsent的使用

简单来说,如果map里没有这个key,那么就按照后面的这个function添加对应的key和value

如果要是有这个key,那么就不添加。

源代码如下

 //1. default
default V computeIfAbsent(K key,
            Function<? super K, ? extends V> mappingFunction) {//第一个参数为Map的key,第二个参数是一个函数接口
        //2. requireNonNull
        Objects.requireNonNull(mappingFunction);
        V v;
        // 将第一个参数作为key,获取value,并将其赋给v ,判断是否为null
        if ((v = get(key)) == null) {
               //若v 为null,则创建一个新的值newValue
            V newValue;
            // 3. mappingFunction.apply
            if ((newValue = mappingFunction.apply(key)) != null) {
                put(key, newValue);
                return newValue;
            }
        }
        return v;
    }

使用示例代码

import java.util.*; 
  
public class GFG { 
  
    // Main method 
    public static void main(String[] args) 
    { 
  

        Map<String, Integer> map = new Hashtable<>(); 
        map.put("Pen", 10); 
        map.put("Book", 500); 
        map.put("Clothes", 400); 
        map.put("Mobile", 5000); 
  
        System.out.println("hashTable: "
                           + map.toString()); 
  
        // 为缺少的新key提供值
        // 使用computeIfAbsent方法
        map.computeIfAbsent("newPen", k -> 600); 
        map.computeIfAbsent("newBook", k -> 800); 
         
        System.out.println("new hashTable: "
                           + map); 
    } 
} 

输出结果:

hashTable:{Book = 500,Mobile = 5000,Pen = 10,Clothes = 400}
new hashTable:{newPen = 600,Book = 500,newBook = 800,Mobile = 5000,Pen = 10,Clothes = 400}

使用场景:我们不知道key是否存在,只是新增key及对应的值,不对之前的key和值做修改。


推荐文档