如何使用Java Streams从对象列表中获取Set

Syn*_*ter 4 java collections java-8 java-stream

这可能是一个简单的Java流问题.说,我有一个List<Student>对象.

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

    public Set<String> getSubjects() {
        return subjects;
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得学生名单上的所有科目?

我可以使用for each循环来完成此操作.如何将以下代码转换为使用Streams?

for (Student student : students) {
    subjectsTaken.addAll(student.getSubjects());
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用Java 8流.这给了我一个Incompatible types错误.

Set<String> subjectsTaken = students.stream()
        .map(student -> student.getSubjects())
        .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 5

您当前的代码生成a Set<Set<String>>而不是a Set<String>.

你应该使用flatMap,而不是map:

Set<String> subjectsTaken = 
    students.stream() // Stream<Student>
           .flatMap(student -> student.getSubjects().stream()) // Stream<String>
           .collect(Collectors.toSet()); // Set<String>
Run Code Online (Sandbox Code Playgroud)