![](/img/trans.png)
[英]Why does a parallel Java Stream with a short-curcuit operation evaluate all elements of the Stream while a sequential Stream does not?
[英]Java stream with parallel elements and sequential elements
我想运行 Java stream ,其中第一个元素与第二个和第三个元素并行过滤。 第二个和第三个元素不能并行过滤,因为使用了共享资源。
int numberOfFilteredElements = Stream.of(firstElement, secondElememt, thirdElement)
.filter(element -> element.someFilter())
.collect(Collectors.toSet())
.size();
Java stream 可以是并行的或顺序的。 仅当所有流都并行时,连接流才是并行的。 所以我不能创建一个并行和顺序的 stream 并将它们连接起来。
还有其他想法如何用流解决这个问题吗? 或者我是否需要在 someFilter() 中使用 ReentrantLock 之类的锁并对所有元素并行运行 stream?
我们可以说:
Stream #1
。Stream #2
。 然后我们可以创建一个Parent Parallel Stream
,它由Stream #1
, Stream #2
组成:
Predicate<Integer> someFilter = i -> {
try { Thread.sleep(4000); } catch (InterruptedException e) {e.printStackTrace();}
logger.info(i + " filtered on thread id: " + Thread.currentThread().getId());
return i != 7;
};
Stream<Integer> stream1 = IntStream.rangeClosed(0, 3).boxed().filter(someFilter);
Stream<Integer> stream2 = IntStream.rangeClosed(-3, -1).boxed().filter(someFilter);
int numberOfFilteredElements = Stream.of(stream1, stream2)
.parallel()
.flatMap(Function.identity())
.peek(integer -> logger.info("Peeked: " + integer.toString()))
.collect(Collectors.toSet())
.size();
System.out.println("Set size is: " + numberOfFilteredElements);
Output:
2021-04-01 12:56:34.084 INFO 26336 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 2.966 seconds (JVM running for 5.717)
2021-04-01 12:56:38.098 INFO 26336 --- [ main] com.example.demo.DemoApplication : -3 filtered on thread id: 1
2021-04-01 12:56:38.098 INFO 26336 --- [onPool-worker-1] com.example.demo.DemoApplication : 0 filtered on thread id: 22
2021-04-01 12:56:38.100 INFO 26336 --- [ main] com.example.demo.DemoApplication : Peeked: -3
2021-04-01 12:56:38.100 INFO 26336 --- [onPool-worker-1] com.example.demo.DemoApplication : Peeked: 0
2021-04-01 12:56:42.100 INFO 26336 --- [onPool-worker-1] com.example.demo.DemoApplication : 1 filtered on thread id: 22
2021-04-01 12:56:42.100 INFO 26336 --- [ main] com.example.demo.DemoApplication : -2 filtered on thread id: 1
2021-04-01 12:56:42.100 INFO 26336 --- [ main] com.example.demo.DemoApplication : Peeked: -2
2021-04-01 12:56:42.100 INFO 26336 --- [onPool-worker-1] com.example.demo.DemoApplication : Peeked: 1
2021-04-01 12:56:46.101 INFO 26336 --- [onPool-worker-1] com.example.demo.DemoApplication : 2 filtered on thread id: 22
2021-04-01 12:56:46.101 INFO 26336 --- [ main] com.example.demo.DemoApplication : -1 filtered on thread id: 1
2021-04-01 12:56:46.101 INFO 26336 --- [ main] com.example.demo.DemoApplication : Peeked: -1
2021-04-01 12:56:46.101 INFO 26336 --- [onPool-worker-1] com.example.demo.DemoApplication : Peeked: 2
2021-04-01 12:56:50.102 INFO 26336 --- [onPool-worker-1] com.example.demo.DemoApplication : 3 filtered on thread id: 22
2021-04-01 12:56:50.102 INFO 26336 --- [onPool-worker-1] com.example.demo.DemoApplication : Peeked: 3
Set size is: 7
请注意, Stream #1
(可以是您的第一个元素)与Stream #2
(可以是第二个和第三个元素)并行运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.