前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Map.computeIfAbsent()方法

Map.computeIfAbsent()方法

作者头像
向着百万年薪努力的小赵
发布2022-12-02 09:09:20
5410
发布2022-12-02 09:09:20
举报
文章被收录于专栏:小赵的Java学习

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

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

结果一模一样

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 另外,这个方法用来分组没有流式编程好用
  • 结果一模一样
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档