Java 8 中的 java.util.Map#computeIfAbsent

2021-03-18 11:21:58 浏览数 (1)

Java8之前,从map中根据key获取value操作可能会有下面的操作

Object key = map.get("key");

if (key == null) {

key = new Object();

map.put("key", key);

}

Java8之后,上面的操作可以简化为一行,若key对应的value为空,会将第二个参数的返回值存入并返回。

computeIfAbsent() 方法签名如下:

public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction);

首先,判断此 map 中是否存在指定 key 的值 v = get(key):

如果存在(v != null),那就直接返回这个 v ( return v );

如果不存在( v == null),会调用 mappingFunction(key)计算key的value,然后将key = value放入到Map。

如果mappingFunction(key)返回的值为null或抛出异常,则不会有记录存入map。


另外,如果v已经计算好了,那么适合使用putIfAbsent(k, v),如果v还未计算,同时计算需要一些耗时,那么建议使用computeIfAbsent,将获取v值的计算放到lambada表达式体内,这样只有再map不含有k对应值时才会进行获取v值的计算,可以优化性能,代码示例:

public class MapInfo {

public static void computeIfAbsent(){ // jdk1.8新特性哦

HashMap<String> map = new HashMap&lt;>();

map.put("1","is map");

map.put("2","contains a mapping");

map.put("3","specified");

map.put("4","inappropriate");

map.computeIfAbsent("5", MapInfo::apply);

System.out.println(map.get("5"));

}

private static Object apply(String v) {

return v = "is 5";

}

}

0 人点赞