Stream - вложенная коллекция - конвертировать в карту - PullRequest
0 голосов
/ 30 апреля 2018

Допустим, у меня есть 2 класса.

Курс класса

public class Course {
    private int id;
    private String name;
}

Студенческий класс

public class Student {
    private int id;
    private String name;
    private List<Course> courses;
}

У меня есть List<Student>, и каждый Student зачислен на несколько курсов.

Мне нужно отфильтровать результаты с помощью потокового API Java 8 следующим образом.

Map<courseId, List<Student>> 

Я пробовал ниже, но безуспешно:

1-й подход

Map<Integer, List<Student>> courseStudentMap = studentList.stream()
    .collect(Collectors.groupingBy(
        student -> student.getCourses().stream()
            .collect(Collectors.groupingBy(Course::getId))));

2-й подход

Map<Integer, List<Student>> courseStudentMap = studentList.stream()
    .filter(student -> student.getCourses().stream()
        .collect(Collectors.groupingBy(
            Course::getId, Collectors.mapping(Student::student, Collectors.toList()))));

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018
 Map<Integer, List<Student>> result = studentsList
            .stream()
            .flatMap(x -> x.getCourses().stream().map(y -> new SimpleEntry<>(x, y.getId())))
            .collect(Collectors.groupingBy(
                    Entry::getValue,
                    Collectors.mapping(Entry::getKey, Collectors.toList())));
0 голосов
/ 30 апреля 2018

Примерно так должно работать (где SimpleEntry - это класс, который реализует Map.Entry<Integer,Student>:

Map<Integer, List<Student>> courseStudentMap =
    studentList.stream()
               .flatMap(s -> s.getCourses()
                              .stream()
                              .map(c -> new SimpleEntry<>(c.getId(),s)))
               .collect(Collectors.groupingBy(Map.Entry::getKey,
                        Collectors.mapping(Map.Entry::getValue,
                                           Collectors.toList())));

Идея состоит в том, чтобы сначала преобразовать Stream<Student> в Stream всех пар идентификаторов курса и Student с. Получив Stream, вы можете использовать groupingBy для получения желаемого результата Map.

...