CCC*_*CCC 5 lambda java-8 java-stream
我编写了以下代码来获取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)
);
}
Run Code Online (Sandbox Code Playgroud)
我通过检查2..sqrt(n)的范围并滤除偶数来优化它,但现在我想通过存储所有以前找到的素数(我不关心内存)来进一步优化它,这样我可以过滤掉那些素数可以分割的数字,而不仅仅是可被2整除的数字.我知道有更好的解决方案,但它只是对lambdas和溪流的练习.
但现在我想通过存储所有以前找到的素数来进一步优化它
由于这需要将这些值存储在流管道的中间,即作为中间操作,并且根据他们的文档,大多数流中间操作应该是无状态的,因此您尝试使用错误的工具来完成这里的工作。
有状态操作可以通过提取流的Spliterator、将其包装到自定义流中并将其重新包装到新流中来实现,但在这种情况下,考虑到这本质上就是流管道所做的全部工作,这似乎不太合适。
由于您正在尝试运行有状态且可并行的计算任务,因此您可能需要研究fork-join 框架或CompletableFuture。前者也用作并行流实现的一部分,后者使计算及其结果变得更容易。
| 归档时间: |
|
| 查看次数: |
3543 次 |
| 最近记录: |