美文网首页
Java8 Map getOrDefault(),putIfAb

Java8 Map getOrDefault(),putIfAb

作者: yuhan_sining | 来源:发表于2019-11-27 14:01 被阅读0次

    computeIfAbsent

    • put只是简单的添加,当map中存在对应Key的时候,put会覆盖掉原本的value值。
    • computeIfAbsent顾名思义,会检查map中是否存在Key值,如果存在会检查value值是否为空,如果为空就会将K值赋给value。
    // 方法定义
    default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
        ...
    }
    
    // java8之前。从map中根据key获取value操作可能会有下面的操作
    Object value = map.get("key");
    if (value == null) {
        value = new Object();
        map.put("key", value );
    }
    
    // java8之后。上面的操作可以简化为一行,若key对应的value为空,会将第二个参数的返回值存入并返回
    Object key2 = map.computeIfAbsent("key", k -> new Object());
    

    V computeIfAbsent(K, Function<? super K, ? extends V>)
    这个方法有两个参数,Key 和一个根据 Key 来产生 Value 的 Function;然后返回一个 Value。
    这个方法会检查 Map 中的 Key,如果发现 Key 不存在或者对应的值是 null,则调用 Function 来产生一个值,然后将其放入 Map,最后返回这个值;否则的话返回 Map 已经存在的值。

    除此之外,Map 还有两个方法:getOrDefault() 和 putIfAbsent(),这三个方法都接受 Key 和一个“默认值”作为参数,且返回一个 Value。如果不小心把它们搞混用错了,可能会带来大问题。下面分别介绍下。

    getOrDefault

    V getOrDefault(Object, V)
    这个方法同样检查 Map 中的 Key,如果发现 Key 不存在或者对应的值是 null,则返回第二个参数即默认值。要注意,这个默认值不会放入 Map。所以如果你这样写:

    Map<String, List<String>> map = new HashMap<>();
    map.getOrDefault("list1", new ArrayList<>()).add("A");
    

    执行完之后 map 仍然是空的!

    putIfAbsent

    V putIfAbsent(K, V)
    这个方法的逻辑完全不同,注意它不是一个 get() 方法,而是 put() 方法的变种!这个方法的逻辑是,如果 Key 不存在或者对应的值是 null,则将 Value 设置进去,然后返回 null;否则只返回 Map 当中对应的值,而不做其他操作。

    相关文章

      网友评论

          本文标题:Java8 Map getOrDefault(),putIfAb

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