我找到了这个代码,它将N个前素数放入数组。
private IntPredicate p = x -> true;
private int[] primes(int n) {
return IntStream.iterate(2, i -> i + 1)
.filter(x -> p.test(x))
.peek(i -> p = p.and(k -> k % i != 0))
.limit(n)
.toArray();
}
IntPredicate
内部发生了什么?
1条答案
按热度按时间4nkexdtk1#
此代码通过
IntPredicate.and()
方法生成聚合 predicate ,其工作方式如下:因此,成功传递
filter
的每个元素都会通过“逻辑与”&&
将新条件附加到当前 predicate 。在流执行结束时, predicate 将由条件组成,这些条件将根据结果中出现的所有素数检查给定的数。
注意此黑客实现已被破坏:
peek()
是专门为支持调试而引入的操作。它并不意味着用于执行可能影响执行结果的操作。peek
不能保证在并行执行时调用它的顺序,在某些情况下可以进行优化。