使用java8实现对数据的多条件分组

使用java8实现对数据的多条件分组

上一篇使用普通的方式进行分组,原因是工作项目不支持java8,今天抽空看了一下java8的流式分组,就学习记录了一下

创建学生类

@Setter
@Getter
public class StreamTestData {
    Integer id;
    String name;
    Integer age;
    String subject;
    Integer grade;

    @Override
    public String toString() {
        return "StreamTestData{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", subject='" + subject + '\'' +
                ", grade=" + grade +
                '}';
    }
}

创建几条数据

public List<StreamTestData> createList() {
        List<StreamTestData> listData = new ArrayList<>();
        //组一:1001 1
        StreamTestData data1 = new StreamTestData();
        data1.setId(1);
        data1.setAge(18);
        data1.setName("name1");
        data1.setSubject("1001");
        data1.setGrade(1);
        listData.add(data1);
        StreamTestData data2 = new StreamTestData();
        data2.setId(2);
        data2.setAge(18);
        data2.setName("name2");
        data2.setSubject("1001");
        data2.setGrade(1);
        listData.add(data2);
        //组二:1001 2
        StreamTestData data4 = new StreamTestData();
        data4.setId(4);
        data4.setAge(18);
        data4.setName("name4");
        data4.setSubject("1001");
        data4.setGrade(2);
        listData.add(data4);
        //组三:1002 2
        StreamTestData data3 = new StreamTestData();
        data3.setId(3);
        data3.setAge(18);
        data3.setName("name3");
        data3.setSubject("1002");
        data3.setGrade(2);
        listData.add(data3);
        //组三:1002 3
        StreamTestData data5 = new StreamTestData();
        data5.setId(3);
        data5.setAge(18);
        data5.setName("name5");
        data5.setSubject("1002");
        data5.setGrade(3);
        listData.add(data5);
        return listData;
    }

使用分组操作

//分组条件一subject:StreamTestData::getSubject
//分组条件二grade: StreamTestData::getGrade
public void group() {
        List<StreamTestData> dataList = createList();
        Map<String, Map<Integer, List<StreamTestData>>> groups2 = dataList.stream().collect(
                Collectors.groupingBy(StreamTestData::getSubject, Collectors.groupingBy(StreamTestData::getGrade)));
        int max = 0;
        List<StreamTestData> maxList = new ArrayList<>();

        for (Map<Integer, List<StreamTestData>> group1 : groups2.values()) {
            for (List<StreamTestData> group : group1.values()) {
                if (group.size() > max) {
                    max = group.size();
                    maxList = group;
                }
            }
        }
        System.out.println("人数最多的组人数为:" + max);
        if (maxList.size() > 0) {
            maxList.forEach(list -> {
                System.out.println(list.toString());
            });
        }
    }

测试结果

人数最多的组人数为:2
StreamTestData{id=1, name='name1', age=18, subject='1001', grade=1}
StreamTestData{id=2, name='name2', age=18, subject='1001', grade=1}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值