在第n个项目中执行

在第n个项目中执行

我正在寻找关于Stream的操作,该操作使我能够在第n个项目中执行非终端(和/或终端)操作。例如,尽管我使用素数流,但该流可以很容易地生成Web请求,用户操作或其他一些冷数据或实时供稿。

由此:

    Duration start = Duration.ofNanos(System.nanoTime());

    IntStream.iterate(2, n -> n + 1)
            .filter(Findprimes::isPrime)
            .limit(1_000_1000 * 10)
            .forEach(System.out::println);

    System.out.println("Duration: " + Duration.ofNanos(System.nanoTime()).minus(start));

像这样的流函数:
    IntStream.iterate(2, n -> n + 1)
            .filter(Findprimes::isPrime)
            .limit(1_000_1000 * 10)
            .peekEvery(10, System.out::println)
            .forEach( it -> {});

最佳答案

创建一个辅助方法来包装peek()使用者:

public static IntConsumer every(int count, IntConsumer consumer) {
    if (count <= 0)
        throw new IllegalArgumentException("Count must be >1: Got " + count);
    return new IntConsumer() {
        private int i;
        @Override
        public void accept(int value) {
            if (++this.i == count) {
                consumer.accept(value);
                this.i = 0;
            }
        }
    };
}

现在,您几乎可以像想要的那样使用它:
IntStream.rangeClosed(1, 20)
         .peek(every(5, System.out::println))
         .count();

输出量

5
10
15
20

可以将helper方法放入实用程序类中并进行静态导入,类似于 Collectors 类只不过是静态helper方法而已。

正如@ user140547在comment中指出的那样,此代码不是线程安全的,因此不能与并行流一起使用。此外,输出顺序会混乱,因此将其与并行流一起使用实际上没有任何意义。

09-27 09:06