繁体   English   中英

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

[英]How to get a Set from a list of objects using Java Streams

这可能是一个简单的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>

尝试这个:

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

想法是先将学生映射到他们的主题,然后将Stream<Set<String>>压平为Stream<String> ,最后将流收集到Set


我建议你使用方法引用而不是lambda表达式 (如果它不会降低可读性)。

使用Stream<T>#<R>collect另一种选择:

students.stream()
    .map(Student::getSubjects)
    .<Set<String>>collect(HashSet::new, Collection::addAll, Collection::addAll)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM