使用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<>();
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);
StreamTestData data4 = new StreamTestData();
data4.setId(4);
data4.setAge(18);
data4.setName("name4");
data4.setSubject("1001");
data4.setGrade(2);
listData.add(data4);
StreamTestData data3 = new StreamTestData();
data3.setId(3);
data3.setAge(18);
data3.setName("name3");
data3.setSubject("1002");
data3.setGrade(2);
listData.add(data3);
StreamTestData data5 = new StreamTestData();
data5.setId(3);
data5.setAge(18);
data5.setName("name5");
data5.setSubject("1002");
data5.setGrade(3);
listData.add(data5);
return listData;
}
使用分组操作
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}