stream二次分组
时间: 2023-10-24 14:07:22 浏览: 176
stream二次分组是指对一个数据流进行两次分组,即将数据流中的元素按照两个不同的条件进行分组。
可以通过以下步骤来实现stream二次分组:
1. 首先,使用第一个条件对数据流进行第一次分组。可以使用groupBy操作或者partitionBy操作,将数据流中的元素根据第一个条件进行分组。
2. 在每个分组内,再次使用第二个条件对元素进行分组。这可以通过嵌套的groupBy操作来实现。对于groupBy操作,可以根据第二个条件对每个分组内的元素进行分组。
3. 最终得到的结果是两层分组结构,即先按照第一个条件进行分组,再在每个分组内按照第二个条件进行分组。
下面是一个Java 8 Stream API的示例代码:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 假设有一个包含学生信息的列表
List<Student> students = Arrays.asList(
new Student("Alice", "Math", 70),
new Student("Bob", "Math", 80),
new Student("Alice", "English", 90),
new Student("Bob", "English", 85),
new Student("Charlie", "Math", 75),
new Student("Charlie", "English", 95)
);
// 第一次分组:按照姓名
Map<String, List<Student>> firstGrouping = students.stream()
.collect(Collectors.groupingBy(Student::getName));
// 第二次分组:在每个姓名分组内,按照科目
Map<String, Map<String, List<Student>>> secondGrouping = firstGrouping.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().stream().collect(Collectors.groupingBy(Student::getSubject))
));
// 输出结果
secondGrouping.forEach((name, map) -> {
System.out.println(name + ":");
map.forEach((subject, list) -> {
System.out.println(" " + subject + ": " + list);
});
});
}
}
class Student {
private String name;
private String subject;
private int score;
public Student(String name, String subject, int score) {
this.name = name;
this.subject = subject;
this.score = score;
}
public String getName() {
return name;
}
public String getSubject() {
return subject;
}
public int getScore() {
return score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", subject='" + subject + '\'' +
", score=" + score +
'}';
}
}
```
以上代码中,我们首先按照学生的姓名进行第一次分组,然后在每个姓名分组内,再按照科目进行第二次分组。最终输出结果如下:
```
Alice:
English: [Student{name='Alice', subject='English', score=90}]
Math: [Student{name='Alice', subject='Math', score=70}]
Bob:
English: [Student{name='Bob', subject='English', score=85}]
Math: [Student{name='Bob', subject='Math', score=80}]
Charlie:
English: [Student{name='Charlie', subject='English', score=95}]
Math: [Student{name='Charlie', subject='Math', score=75}]
```
这样就实现了对数据流的二次分组。
阅读全文