bal*_*_21 4 java collections lambda java-8 java-stream
是否有可能以更好的方式使用流来执行下面提到的步骤?
Set<Long> memberIds = new HashSet<>();
marksDistribution.parallelStream().forEach(marksDistribution -> {
memberIds.add(marksDistribution.getStudentId());
memberIds.add(marksDistribution.getTeacherId());
});
Run Code Online (Sandbox Code Playgroud)
instanceDistribution.getStudentId()并且instanceDistribution.getTeacherId()都是类型Long.
有可能会提出这类问题,但我无法理解.简单的是或否.如果是/否,那么如何和位解释.如果可能的话,请讨论效率.
是的,您可以使用flatMap将您的单个元素映射Stream到Stream多个元素中,然后将它们展平为单个元素Stream:
Set<Long> memberIds =
marksDistribution.stream()
.flatMap (marksDistribution -> Stream.of(marksDistribution.getStudentId(), marksDistribution.getTeacherId()))
.collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
您可以使用 collect 的 3-args 版本:
Set<Long> memberIds =
marksDistribution.parallelStream()
.collect(HashSet::new,
(s, m) -> {
s.add(m.getStudentId());
s.add(m.getTeacherId());
}, Set::addAll);
Run Code Online (Sandbox Code Playgroud)
您当前的版本可能会产生错误的结果,因为您是在非线程安全集合中并行添加元素。因此,您可能在集合中有多次相同的值。
| 归档时间: |
|
| 查看次数: |
1964 次 |
| 最近记录: |