是否有可能以更好的方式使用流来执行下面提到的步骤?
Set<Long> memberIds = new HashSet<>();
marksDistribution.parallelStream().forEach(marksDistribution -> {
memberIds.add(marksDistribution.getStudentId());
memberIds.add(marksDistribution.getTeacherId());
});
instanceDistribution.getStudentId()
和instanceDistribution.getTeacherId()
都属于Long
类型。
有可能会问这类问题,但我无法理解。简单的是或否。如果是/否,那么如何和位解释。 如果可能,请讨论效率。
答案 0 :(得分:7)
是的,您可以使用flatMap
将Stream
的单个元素映射到多个元素的Stream
,然后将它们展平为一个Stream
:< / p>
Set<Long> memberIds =
marksDistribution.stream()
.flatMap (marksDistribution -> Stream.of(marksDistribution.getStudentId(), marksDistribution.getTeacherId()))
.collect(Collectors.toSet());
答案 1 :(得分:4)
您可以使用3-args版本的collect:
Set<Long> memberIds =
marksDistribution.parallelStream()
.collect(HashSet::new,
(s, m) -> {
s.add(m.getStudentId());
s.add(m.getTeacherId());
}, Set::addAll);
您当前的版本可能会产生错误的结果,因为您在非线程安全集合中并行添加元素。因此,您可能会在集合中多次使用相同的值。