Как получить Set из списка объектов с использованием Java Streams - PullRequest
0 голосов
/ 17 декабря 2018

Это может быть простой вопрос о потоках Java.Скажем, у меня есть объект List<Student>.

public class Student {
    public String name;
    public Set<String> subjects;

    public Set<String> getSubjects() {
        return subjects;
    }
}

Как я могу получить все предметы из списка студентов?

Я могу сделать это, используя для каждого цикла.Как я могу преобразовать приведенный ниже код для использования потоков?

for (Student student : students) {
    subjectsTaken.addAll(student.getSubjects());
}

Вот моя попытка использования потоков Java 8.Это дает мне ошибку Incompatible types.

Set<String> subjectsTaken = students.stream()
        .map(student -> student.getSubjects())
        .collect(Collectors.toSet());

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Попробуйте:

Set<String> subjectsTaken = 
                   students.stream()
                           .map(Student::getSubjects)
                           .flatMap(Set::stream) 
                           .collect(Collectors.toSet());

Идея состоит в том, чтобы сначала сопоставить учащихся с их предметами, а затем сгладить значения Stream<Set<String>> до Stream<String> и, наконец, собрать поток в Set.


Я бы предложил вам использовать ссылки на методы вместо лямбда-выражений , где это возможно (если это не ухудшает читабельность).

0 голосов
/ 17 декабря 2018

Другая альтернатива с использованием Stream<T>#<R>collect:

students.stream()
    .map(Student::getSubjects)
    .<Set<String>>collect(HashSet::new, Collection::addAll, Collection::addAll)
0 голосов
/ 17 декабря 2018

Ваш текущий код выдает Set<Set<String>>, а не Set<String>.

Вы должны использовать flatMap, а не map:

Set<String> subjectsTaken = 
    students.stream() // Stream<Student>
           .flatMap(student -> student.getSubjects().stream()) // Stream<String>
           .collect(Collectors.toSet()); // Set<String>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...