Stream流分组

时间:2024-11-09 14:14:20

一、准备4个用户对象

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

 二、按属性给对象分组

例子:按性别给用户分组

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

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

按性别分组统计名称List

Map<String, List<String>> sexAndNameListMap = ()
                .collect((User::getSex, (User::getName, ())));

按性别分组统计名称Set

Map<String, Set<String>> sexAndNameSetMap = ()
                .collect((User::getSex, (User::getName, ())));

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

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

Map<String, Map<String, User>> sexAndNameAndDataMap = ()
                .collect((User::getSex, (User::getName, data -> data)));

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

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

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

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

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

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

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

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

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