美文网首页
Java8 Map常用三个方法

Java8 Map常用三个方法

作者: 码而优则仕 | 来源:发表于2020-05-11 19:57 被阅读0次

    Map 的 getOrDefault(),putIfAbsent() 和 computeIfAbsent() 三个方法

    • V computeIfAbsent(K, Function<? super K, ? extends V>)

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

      Java8之前的写法:

      synchronized (this.dependentBeanMap) {
                dependentBeans = this.dependentBeanMap.get(canonicalName);
                if (dependentBeans == null) {
                    dependentBeans = new LinkedHashSet<>(8);
                    this.dependentBeanMap.put(canonicalName, dependentBeans);
                }
                dependentBeans.add(dependentBeanName);
      }
      

      java8的写法:

      synchronized (this.dependentBeanMap) {
                //获取当前 bean依赖的 bean名字集合---如果没有依赖则返回空列表
                Set<String> dependentBeans =
                        this.dependentBeanMap.computeIfAbsent(canonicalName, k -> new LinkedHashSet<>(8));
                //如果注册依赖的 bean在 当前bean依赖的bean集合中不存在则尝试加入集合中,加入失败则直接返回
                if (!dependentBeans.add(dependentBeanName)) {
                    return;
                }
            }
      
    • V getOrDefault(Object, V)

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

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

      执行完之后 map 仍然是空的!—只是返回default

    • V putIfAbsent(K, V)

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

    相关文章

      网友评论

          本文标题:Java8 Map常用三个方法

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