与java.util.stream.Stream并行处理两个列表

时间:2014-03-05 17:43:15

标签: java java-8

对于每个列表中的每个元素 i 执行操作。元素可以按任何顺序处理。例如在旧的java中:

List<A> aList;
List<B> bList; // aList is larger than bList

for (int i=0; i<bList.size(), i++) {
  aList.get(i).doSomethingWith(bList.get(i));
}

for (int j=i; j<aList.size(), j++) {
  aList.get(j).doSomething();
}

使用java.util.stream.Stream实现此功能的最佳方法是哪种,因此可以并行处理元素?

2 个答案:

答案 0 :(得分:16)

您需要并行处理这两个列表,因此我认为您不能自行流式传输列表。但是,您可以流式传输索引并对其进行处理:

IntStream.range(0, aList.size())
    .parallel()
    .forEach(i -> {
        if (i < bList.size()) aList.get(i).doSomethingWith(bList.get(i));
        else aList.get(i).doSomething();
    });

答案 1 :(得分:5)

仅仅因为Stream是新的,并不意味着你应该忘记Java提供的所有其他工具。即使使用这些优秀的旧工具,使用Java 8也会变得更加顺畅:

List<A> aList;
List<B> bList; // aList is larger than bList

ExecutorService exec = Executors.newCachedThreadPool();
int a=aList.size(), b=bList.size();
assert a>b;
Future<?> f1=exec.submit(()->IntStream.range(0, b)
   .parallel().forEach(i->aList.get(i).doSomethingWith(bList.get(i)))
);
Future<?> f2=exec.submit(()->aList.subList(b, a)
   .stream().parallel().forEach(A::doSomething)
);
f1.get();
f2.get();
exec.shutdown();