![](/img/trans.png)
[英]How extract sorted list of distinct integers from a Set of objects using Java streams?
[英]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.