【问题标题】:How to use groupingBy of stream API for multi level nested classes?如何将流 API 的 groupingBy 用于多级嵌套类?
【发布时间】:2020-05-17 23:41:19
【问题描述】:

我有一个 Student 对象 List<Student> allStudents 的列表,我需要从中找出哪个学生使用 Java 8 流 API 在每门课程和任务中获得了多少分数。我遇到了一些像one 这样的旧帖子,但不适用于我的问题。

下面是我的嵌套类:

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;
    }
}

不知何故,多级分组对我不起作用。有人可以指导我吗?

【问题讨论】:

    标签: collections java-stream


    【解决方案1】:

    正如您在引用的旧问题中提到的,可以使用平面映射方法,其中每个嵌套级别都被平面映射到所需的级别,如下所示:

        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)
                ));
    

    注意:这是使用 typedtuples 库中的元组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2020-02-02
      • 2022-01-25
      • 2018-12-23
      • 2014-01-30
      • 2015-06-23
      • 2021-05-09
      相关资源
      最近更新 更多