Stream流分组

2年前 (2022) 程序员胖胖胖虎阿
167 0 0

一、准备4个用户对象

User user1 = User.builder()
                .name("blues")
                .sex("man")
                .age(20)
                .build();
        User user2 = User.builder()
                .name("blues")
                .sex("woman")
                .age(19)
                .build();
        User user3 = User.builder()
                .name("blues")
                .sex("woman")
                .age(18)
                .build();
        User user4 = User.builder()
                .name("blues")
                .sex("woman")
                .age(17)
                .build();
        List<User> users = new ArrayList<>();
        users.add(user3);
        users.add(user2);
        users.add(user3);
        users.add(user4);

 二、按属性给对象分组

例子:按性别给用户分组

        Map<String, List<User>> sexAndUserMap = users.parallelStream()
                .collect(Collectors.groupingBy(User::getSex));

三、按A属性分组统计B属性List(Set)

按性别分组统计名称List

Map<String, List<String>> sexAndNameListMap = users.parallelStream()
                .collect(Collectors.groupingBy(User::getSex, Collectors.mapping(User::getName, Collectors.toList())));

按性别分组统计名称Set

Map<String, Set<String>> sexAndNameSetMap = users.parallelStream()
                .collect(Collectors.groupingBy(User::getSex, Collectors.mapping(User::getName, Collectors.toSet())));

四、按A属性分组统计B属性和对象本身

按性别分组统计名称以及用户本身。

Map<String, Map<String, User>> sexAndNameAndDataMap = users.parallelStream()
                .collect(Collectors.groupingBy(User::getSex, Collectors.toMap(User::getName, data -> data)));

这里需要确保B属性在A属性下是唯一的,

示例中得保证名称在各性别组下是唯一的否则会产生用户覆盖。如果不是唯一的,可以采用多级分组

五、多级分组,按A属性分组,在此基础上按B属性分组

Map<String, Map<String, List<User>>> SexAndNameAndUserListMap = users.parallelStream()
                .collect(Collectors.groupingBy(User::getSex, Collectors.groupingBy(User::getName)));

六、遍历对象拿A和B属性建立Map映射关系

遍历用户,构建一个名称与性别的Map映射关系

Map<String, String> nameAndSexMap = users.parallelStream()
                .collect(Collectors.toMap(User::getName, User::getSex));

这里需要确保A在全局下是唯一的,否则会出现B属性值覆盖的情况

在示例中需要确保名称在所有用户下是唯一的,否则会出现性别覆盖的情况

版权声明:程序员胖胖胖虎阿 发表于 2022年11月6日 上午10:40。
转载请注明:Stream流分组 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...