java - 在其迭代过滤器函数中调用 IntStream

标签 java recursion java-8 java-stream

我正在尝试创建一个无限的素数 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/

相关文章:

java - 在 Tomcat 启动后启动监听器?

java - 使用 Lambda 对列表进行排序和分组

java - 如何计算嵌套列表的项目?

java - java中如何动态初始化Object[]?

Java Swing UI 对齐问题

recursion - 方案 - 未绑定(bind)变量 : unquote

c++ - 转换为递归函数?

Java - 如何告诉所有子线程都完成了

java - 无法访问 IDempiere - java.io.IOException : java. util.concurrent.TimeoutException:空闲超时已过期:123000/123000 毫秒

c++ - 非递归后序图遍历?