编程中经常遇到这种数据结构,判断一个map中是否存在这个key,如果存在则处理value的数据,如果不存在,则创建一个满足value要求的数据结构放到value中。以前常用的方法如下:
import java.util.*;
public class TestComputeIfAbsent {
public static void main(String[] args) {
// 数据准备 HashMap中 键是String类型,值是Set集合,Set中存放了String类型元素
HashMap<String, Set<String>> map = new HashMap<>();
Set<String> set = new HashSet<>();
set.add("张三");
set.add("王五");
map.put("China", set);
System.out.println(map);
// 判断集合键中有无France, 有则添加李四;没有则添加键France,及对应值李四
if (map.containsKey("France")) {
// 若存在China,则向键对应的值中添加李四
map.get("France").add("李四");
} else {
// 若不存在China
Set<String> tempset = new HashSet<>();
tempset.add("李四");
map.put("France", tempset);
}
}
}
官方非常的贴心,为了满足广大用户的要求,加入了computeIfAbsent() 这个api,使用后以上代码变成了下面的形式:
import java.util.*;
public class TestComputeIfAbsent {
public static void main(String[] args) {
// 数据准备 HashMap中 键是String类型,值是Set集合,Set中存放了String类型元素
HashMap<String, Set<String>> map = new HashMap<>();
Set<String> set = new HashSet<>();
set.add("张三");
set.add("王五");
map.put("China", set);
System.out.println(map);
map.computeIfAbsent("France", k -> new HashSet<>()).add("李四");
System.out.println(map);
}
}
map.computeIfAbsent("France", k -> new HashSet<>()).add("李四");
的意思表示key为“France”的建值对是否存在,如果存在则获取France的值,并操作值的set添加数据“lisi"。若不存在,在将键和值创建并put到map中。