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 当中对应的值,而不做其他操作。
网友评论