我正在寻找关于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中指出的那样,此代码不是线程安全的,因此不能与并行流一起使用。此外,输出顺序会混乱,因此将其与并行流一起使用实际上没有任何意义。