Java 8 Streams - 使用流将相同类型的多个对象映射到列表

时间:2017-01-17 10:21:34

标签: java collections lambda java-8 java-stream

是否有可能以更好的方式使用流来执行下面提到的步骤?

Set<Long> memberIds = new HashSet<>();
marksDistribution.parallelStream().forEach(marksDistribution -> {
        memberIds.add(marksDistribution.getStudentId());
        memberIds.add(marksDistribution.getTeacherId());
      });

instanceDistribution.getStudentId()instanceDistribution.getTeacherId()都属于Long类型。

有可能会问这类问题,但我无法理解。简单的是或否。如果是/否,那么如何和位解释。 如果可能,请讨论效率。

2 个答案:

答案 0 :(得分:7)

是的,您可以使用flatMapStream的单个元素映射到多个元素的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);

您当前的版本可能会产生错误的结果,因为您在非线程安全集合中并行添加元素。因此,您可能会在集合中多次使用相同的值。