假设咱们定义下面一个 Map:java
Map<String, List<String>> map = new HashMap<>();
若是咱们要放一个元素进去,不少人会这么写:code
List<String> list = map.get("list1"); if (list == null) { list = new ArrayList<>(); map.put("list1", list); } list.add("A");
实际上从 Java 8 开始,Map
提供了 computeIfAbsent()
方法,咱们能够写成一行便可:get
map.computeIfAbsent("list1", k -> new ArrayList<>()).add("A");
其中变量 k 是 Map 的 key。io
是否是很方便?可是除此以外,Map 还有两个方法:getOrDefault()
和 putIfAbsent()
,这三个方法都接受 Key 和一个“默认值”做为参数,且返回一个 Value。若是不当心把它们搞混用错了,可能会带来大问题。下面分别介绍下。class
这个方法有两个参数,Key 和一个根据 Key 来产生 Value 的 Function;而后返回一个 Value。
这个方法会检查 Map 中的 Key,若是发现 Key 不存在或者对应的值是 null,则调用 Function 来产生一个值,而后将其放入 Map,最后返回这个值;不然的话返回 Map 已经存在的值。变量
这个方法一样检查 Map 中的 Key,若是发现 Key 不存在或者对应的值是 null,则返回第二个参数即默认值。要注意,这个默认值不会放入 Map。因此若是你这样写:List
Map<String, List<String>> map = new HashMap<>(); map.getOrDefault("list1", new ArrayList<>()).add("A");
执行完以后 map 仍然是空的!map
这个方法的逻辑彻底不一样,注意它不是一个 get()
方法,而是 put()
方法的变种!这个方法的逻辑是,若是 Key 不存在或者对应的值是 null,则将 Value 设置进去,而后返回 null;不然只返回 Map 当中对应的值,而不作其余操做。方法
因此显而易见,在最开始的例子中,若是将 computeIfAbsent()
替换成其余两个方法都是错的。co