我编写了以下代码来从 2..n 中获取所有质数
private static LongStream getPrimesStream(long number) {
return LongStream.range(2, number + 1)
.filter(PrimeStreamTest::isPrime);
}
private static boolean isPrime(final long number) {
return number == 2 || (number % 2 != 0 && LongStream
.range(2, (long) Math.ceil(Math.sqrt(number + 1)))
.filter(n -> n % 2 != 0)
.noneMatch(divisor -> number % divisor == 0)
);
}
我通过检查 2..sqrt(n) 的范围并过滤掉偶数来优化它,但现在我想通过存储所有以前找到的素数来进一步优化它(我不关心内存),这样我可以过滤掉能被这些素数整除的数,而不仅仅是能被 2 整除的数。
我知道有更好的解决方案,但这只是对 lambdas 和流的练习。
最佳答案
but now I want to further optimize it by storing all previously found primes
由于这需要将这些值存储在流管道的中间,即作为一个中间操作,并且大多数流中间操作应该是无状态的,根据他们的文档,您在这里尝试使用错误的工具来完成这项工作。
可以通过提取流的
Spliterator
来实现有状态的操作。 , 将其包装成一个自定义的并将其重新包装成一个新的流,但在这种情况下,这似乎不太合适,因为这基本上就是您的流管道所做的一切。由于您正在尝试运行有状态且可并行化的计算任务,因此您可能需要查看 fork-join framework或 CompletableFuture反而。前者也用作并行流实现的一部分,而后者使组合计算及其结果更容易。
关于lambda - 计算素数(流和 lambda),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801573/