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

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

如何获取学生列表中的所有科目?

我可以使用 for each 循环来做到这一点。如何转换以下代码以使用 Streams?

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

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

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

最佳答案

您当前的代码生成一个 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>

关于java - 如何使用 Java Streams 从对象列表中获取 Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53816208/

相关文章:

java - ORA-02291 : integrity constraint violated - parent key not found When trying to insert null in foreign key

collections - 如果元素可以转换,为什么不能使用 .into() 转换容器?

java - Comparator.comparing(...).thenComparing(...) 找出哪些字段不匹配

java - 是否有一种可移植的方法来获取 Maven 项目中资源的路径?

java - 当我在 ByteBuddy 生成的类中创建自定义构造函数时出现异常

用于解析 Latex 或 MathML 字符串的 Java 或 scala 库

java - 如何使用java计算哈希表中单词出现的频率

java - 为什么尽管类是可序列化的,但HashMap的哈希表标记为 transient

java stream - 字符串拆分两次后得到结果

java - Tomcat 6/7,Java 8 : Can't compile JSP: [various types] cannot be resolved