Java根据对象属性个数分组并排序

Java根据对象属性个数分组并排序

有个需求,期望根据对象的某个字段的数量做统计导出,例如:user name = 张三, age = 18 , 有一百个user, 叫张三,年龄 = 18 的有 10个, 张三 年龄 = 20 的有 5 个, 李四 年龄 = 18 的有8 个, 李四年龄 =20 的有 4个。。。。

    @Data
    @Accessors(chain = true)
    public static class User{
        private String age;
        private String name;
    }
List<User> list = new ArrayList();
        list.add(new User().setName("44A80").setAge("A"));
        list.add(new User().setName("44A80").setAge("A"));
        list.add(new User().setName("44A80").setAge("A"));
        list.add(new User().setName("44A80").setAge("A"));
        list.add(new User().setName("44A80").setAge("A"));
        list.add(new User().setName("44A80").setAge("A"));
        list.add(new User().setName("44A80").setAge("A"));
        list.add(new User().setName("44A80").setAge("A"));
        list.add(new User().setName("44A80").setAge("B"));
        list.add(new User().setName("44A80").setAge("B"));
        list.add(new User().setName("44A80").setAge("B"));
        list.add(new User().setName("44A80").setAge("B"));


        list.add(new User().setName("44A81").setAge("A"));
        list.add(new User().setName("44A81").setAge("A"));
        list.add(new User().setName("44A81").setAge("A"));
        list.add(new User().setName("44A81").setAge("A"));
        list.add(new User().setName("44A81").setAge("A"));
        list.add(new User().setName("44A81").setAge("A"));
        list.add(new User().setName("44A81").setAge("A"));
        list.add(new User().setName("44A81").setAge("A"));
        list.add(new User().setName("44A81").setAge("B"));
        list.add(new User().setName("44A81").setAge("B"));
        list.add(new User().setName("44A81").setAge("B"));
        list.add(new User().setName("44A81").setAge("B"));

// 根据name 和age 分组并根据age数量排序
        list.stream().collect(Collectors.groupingBy(e -> StrUtil.concat(true, e.getName(), e.getAge())))
                .entrySet().stream()
                .sorted(Comparator.comparing(e -> -e.getValue().size()))
                .map(e -> e.getValue().get(0))
                .collect(Collectors.toList());
        System.out.println(list);

调试代码:

将断点打在lambda的行上面,点检图标,既可以看到lamdba的执行过程
在这里插入图片描述
在这里插入图片描述

最终结果:

在这里插入图片描述
记录一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值