Java 8 中的 java.util.Map#computeI

作者: 光剑书架上的书 | 来源:发表于2021-03-16 23:22 被阅读0次

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";

    }

}

相关文章

网友评论

    本文标题:Java 8 中的 java.util.Map#computeI

    本文链接:https://www.haomeiwen.com/subject/wsgjcltx.html