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<>();
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";
}
}