Collections 如何将流API的groupingBy用于多级嵌套类?
我有一个Collections 如何将流API的groupingBy用于多级嵌套类?,collections,java-stream,Collections,Java Stream,我有一个学生对象的列表列出所有学生,我需要从中找出哪个学生使用Java8流API在每门课程和每项任务中获得了多少分数。我遇到过一些像这样的老帖子,但不能适用于我的问题 下面是我的嵌套类: public class Student{ private long studentId; private List<Course> courses; public long getStudentId() { return studentId; }
学生
对象的列表列出所有学生
,我需要从中找出哪个学生使用Java8流API在每门课程和每项任务中获得了多少分数。我遇到过一些像这样的老帖子,但不能适用于我的问题
下面是我的嵌套类:
public class Student{
private long studentId;
private List<Course> courses;
public long getStudentId() {
return studentId;
}
public List<Course> getCourses() {
return courses;
}
}
public class Course{
private long courseId;
private List<Task> tasks;
public long getCourseId() {
return courseId;
}
public List<Task> getTasks() {
return tasks;
}
}
public class Task{
private long taskId;
private List<Assessment> assessments;
public long getTaskId() {
return taskId;
}
public List<Assessment> getAssessments() {
return assessments;
}
}
public class Assessment{
private String type;
private double score;
public String getType() {
return type;
}
public double getScore() {
return score;
}
}
公共班级学生{
私立长期学生;
私人名单课程;
公共长getStudentId(){
返回学生ID;
}
公开课程名单{
返回课程;
}
}
公共课{
私人长假;
私有列表任务;
公共长getCourseId(){
返回路线ID;
}
公共列表getTasks(){
返回任务;
}
}
公开课任务{
私人长任务ID;
私人名单评估;
公众长期关注{
返回taskId;
}
公开名单{
回报评估;
}
}
公开课评估{
私有字符串类型;
私人双积分;
公共字符串getType(){
返回类型;
}
公众双倍得分(){
返回分数;
}
}
不知何故,多级分组对我来说不起作用。有谁能给我提供这方面的指导吗?正如您在引用的旧问题中提到的,可以使用平面映射方法,其中每个嵌套级别都平面映射到所需的级别,如下所示:
Map<Triple<Long, Long, Long>, Double> result = allStudents.stream()
.flatMap(s -> s.getCourses().stream().map(
c -> ImmutableTuple.of(s.getStudentId(), c)))
.flatMap(sc -> sc.get().getTasks().stream().map(
t -> ImmutableTuple.of(sc.getFirst(), sc.get().getCourseId(), t)))
.flatMap(sct -> sct.get().getAssessments().stream().map(
a -> ImmutableTuple.of(sct.getFirst(), sct.getSecond(), sct.get().taskId, a.getScore())))
.collect(Collectors.groupingBy(
ImmutableQuadruple::remove,
Collectors.summingDouble(ImmutableQuadruple::get)
));
Map result=allStudents.stream()
.flatMap(s->s.getCourses().stream().map(
c->ImmutableTuple.of(s.getStudentId(),c)))
.flatMap(sc->sc.get().getTasks().stream().map(
t->ImmutableTuple.of(sc.getFirst(),sc.get().getCourseId(),t)))
.flatMap(sct->sct.get().getAssessments().stream().map(
a->ImmutableTuple.of(sct.getFirst()、sct.getSecond()、sct.get().taskId、a.getScore())
.collect(收集器.groupingBy(
ImmutableFourple::删除,
Collectors.summingDouble(不可变的四元组::get)
));
注意:这是使用typedtuples库中的元组