Map 的 computeIfAbsent方法使用
假设我们定义下面一个 Map:
Map<String, List<String>> map = new HashMap<>();
如果我们要放一个元素进去,很多人会这么写:
List<String> list = map.get("list1");
if (list == null) {
list = new ArrayList<>();
map.put("list1", list);
}
list.add("A");
分析一下,从第一行到第五行,从map集合中获取一个集合对象,比如上面例子的List<String>
。
如果集合对象为空,这时是添加不了元素的。但是集合对象也就是list
已经声明,所以,我们分配一块空间,指向list
就可以添加往集合对象添加元素了(就是new
一个ArrayList
)。
实际上从 Java 8 开始,Map 提供了 computeIfAbsent() 方法,我们可以写成一行即可:
map.computeIfAbsent("list1", k -> new ArrayList<>()).add("A");
例子2
JDK1.8以前的写法
if (successors.containsKey(currentWord)) {
successors.get(currentWord).add(nextWord);
} else {
Set<String> newSet = new HashSet<>();
newSet.add(nextWord);
successors.put(currentWord, newSet);
}
JDK1.8的写法
successors.computeIfAbsent(currentWord, a -> new HashSet<>());
successors.get(currentWord).add(nextWord);
总结
可以看得出来,可以Map的Value是集合的话,可以使用JDK1.8的简洁写法,当然,这不是说以前的写法不好。两种方法都可以使用。
java8 使用Map中的computeIfAbsent方法构建本地缓存,提高程序效率
How do I use the new computeIfAbsent function?
Map 的 computeIfAbsent等三个方法的使用