我正在尝试创建一个无限的素数 IntStream,并且它必须很快 - 在几秒钟内生成大约一百万个素数。所以我尝试创建使用过滤器调用生成的流IntStream本身:
IntStream primeStream = IntStream.iterate(2, n -> n + 1)
.filter(PrimeStream::isPrime);
使用isPrime,如下所示:
public boolean isPrime(int n, IntStream primeStream) {
primeStream.forEach((p) -> {
if (n % p == 0)
return false;
if (p > Math.sqrt(n))
break;
});
return true;
}
那这可能吗?或者还有其他方式使用 Stream 来完成我的任务吗?
最佳答案
无限IntStream
的全部要点是它不消耗内存,即它不会“记住”流式传输值。它只是产生新的 int
值。
如果你需要记住值(value)观,你需要自己做。
我建议使用IntStream.generate(IntSupplier s)
,带有 IntSupplier
它会记住之前生成的素数。
public final class PrimeGenerator implements IntSupplier {
private final List<Integer> primes = new ArrayList<>();
@Override
public int getAsInt() {
int prime;
final int count = this.primes.size();
if (count == 0)
prime = 2;
else if (count == 1)
prime = 3;
else {
prime = this.primes.get(count - 1) + 2;
while (! isPrime(prime))
prime += 2;
}
this.primes.add(prime);
return prime;
}
private boolean isPrime(int n) {
for (int p : this.primes) {
if (n % p == 0)
return false;
if (p * p > n)
return true;
}
return true;
}
}
像这样使用它:
long start = System.nanoTime();
System.out.println(IntStream.generate(new PrimeGenerator()).limit(1000000).max().getAsInt());
long stop = System.nanoTime();
System.out.println("Elapsed: " + (stop - start) / 1000000000d + " seconds");
将显示第 100 万个质数:
15485863
Elapsed: 1.749469734 seconds
关于java - 在其迭代过滤器函数中调用 IntStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43697086/