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的执行过程
最终结果:
记录一下