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库中的元组