lambda - 计算素数(流和 lambda)

标签 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)
    );
}

我通过检查 2..sqrt(n) 的范围并过滤掉偶数来优化它,但现在我想通过存储所有以前找到的素数来进一步优化它(我不关心内存),这样我可以过滤掉能被这些素数整除的数,而不仅仅是能被 2 整除的数。
我知道有更好的解决方案,但这只是对 lambdas 和流的练习。

最佳答案

but now I want to further optimize it by storing all previously found primes



由于这需要将这些值存储在流管道的中间,即作为一个中间操作,并且大多数流中间操作应该是无状态的,根据他们的文档,您在这里尝试使用错误的工具来完成这项工作。

可以通过提取流的 Spliterator 来实现有状态的操作。 , 将其包装成一个自定义的并将其重新包装成一个新的流,但在这种情况下,这似乎不太合适,因为这基本上就是您的流管道所做的一切。

由于您正在尝试运行有状态且可并行化的计算任务,因此您可能需要查看 fork-join frameworkCompletableFuture反而。前者也用作并行流实现的一部分,而后者使组合计算及其结果更容易。

关于lambda - 计算素数(流和 lambda),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801573/

相关文章:

c# - 我可以而且应该将修改字节数组的委托(delegate)转换为 Lambda 表达式吗?

java - 使用stream API返回一定数量的枚举值

java - 查找对象列表中元素的最大大小

java - Java 8 findFirst().isPresent() 是否比 count() > 0 更有效?

java - 如何使用 MethodHandles.Lookup 查找数组构造函数 MethodHandle?

java - 使用 Java 8 流和 CompletableFuture 的并行数据库调用

java - 将 Map<A, B> 转换为 List< Pair<A,B>> - 在 A、B 是类的情况下,这是最有效的吗?

c# - LINQ 中的可迭代析取

c# - 在 C# 中定义和访问选定属性的最佳方式是什么?

c# - 从列表中获取数据以在代码中使用?