公司代码中突然出现了这个方法,看了半天百思不得其解 百度后豁然开朗
代码语言:javascript复制// 方法定义
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
...
}
// java8之前。从map中根据key获取value操作可能会有下面的操作
Object key = map.get("key");
if (key == null) {
key = new Object();
map.put("key", key);
}
// java8之后。上面的操作可以简化为一行,若key对应的value为空,会将第二个参数的返回值存入并返回
Object key2 = map.computeIfAbsent("key", k -> new Object());
}
是不是不好理解,举个栗子说明
有这样一个实体类
代码语言:javascript复制public class user {
private int id;
private int age;
private String name;
private String sex;
}
写个填充数据的方法
代码语言:javascript复制public static List<user> list(List<user> list){
user user1 = new user(1,11,"小明","男");
user user2 = new user(2,12,"小红","女");
user user3 = new user(3,13,"小黄","女");
user user4 = new user(4,14,"小蓝","男");
user user5 = new user(5,15,"小绿","男");
List<user> userList = Arrays.asList(user1,user2,user3,user4,user5);
return list=userList;
}
现在我们要求基于性别分组?利用computeIfAbsent()方法,怎么写?
代码语言:javascript复制public static void main(String[] args) {
List<User> list = new ArrayList<>();
//调用方法填充数据
list = list(list);
Map<String,List<User>> maps = new HashMap<>();
//基于性别分组
for (User user:list) {
List<User> userList = maps.computeIfAbsent(user.getSex(),key -> new ArrayList<>());
userList.add(user);
}
//遍历打印
for(Map.Entry<String, List<User>> entry : maps.entrySet()){
System.out.println("Key = " entry.getKey() ",value=" entry.getValue());
}
}
输出:
代码语言:javascript复制Key = 女,value=[user{id=2, age=12, name='小红', sex='女'}, user{id=3, age=13, name='小黄', sex='女'}]
Key = 男,value=[user{id=1, age=11, name='小明', sex='男'}, user{id=4, age=14, name='小蓝', sex='男'}, user{id=5, age=15, name='小绿', sex='男'}]
另外,这个方法用来分组没有流式编程好用
上代码:
代码语言:javascript复制 //流式编程根据性别分组
Map<String,List<User>> maps = list.stream().collect(Collectors.groupingBy(User::getSex));
遍历打印结果:
代码语言:javascript复制Key = 女,value=[user{id=2, age=12, name='小红', sex='女'}, user{id=3, age=13, name='小黄', sex='女'}]
Key = 男,value=[user{id=1, age=11, name='小明', sex='男'}, user{id=4, age=14, name='小蓝', sex='男'}, user{id=5, age=15, name='小绿', sex='男'}]