繁体   English   中英

Java stream 具有并行元件和顺序元件

[英]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 #1Stream #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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM