Map.computeIfAbsent()方法

2022-12-02 09:09:20 浏览数 (1)

公司代码中突然出现了这个方法,看了半天百思不得其解 百度后豁然开朗

代码语言: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='男'}]

结果一模一样

0 人点赞