Java 在迭代过滤器函数中调用IntStream

Java 在迭代过滤器函数中调用IntStream,java,recursion,java-8,java-stream,Java,Recursion,Java 8,Java Stream,我正在尝试创建一个无限素数IntStream,它必须是快速的——在几秒钟内生成大约一百万个素数。因此我尝试创建使用filter recallIntStream自身生成的流: 使用iPrime如下: 那有可能吗?或者是否有其他方法使用流来完成我的任务?无限IntStream的整个要点是它不消耗内存,即它不“记住”流值。它只生成新的int值 如果你需要记住价值观,你需要自己去做 我建议使用,带有一个记忆先前生成的素数的 public final class PrimeGenerator impl

我正在尝试创建一个无限素数IntStream,它必须是快速的——在几秒钟内生成大约一百万个素数。因此我尝试创建使用filter recallIntStream自身生成的流:

使用iPrime如下:


那有可能吗?或者是否有其他方法使用流来完成我的任务?

无限
IntStream
的整个要点是它不消耗内存,即它不“记住”流值。它只生成新的
int

如果你需要记住价值观,你需要自己去做

我建议使用,带有一个记忆先前生成的素数的

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;
    }
}
将显示第一百万个素数:

15485863
已用时间:1.749469734秒

无限
IntStream
的整个要点是它不消耗内存,即它不“记住”流值。它只生成新的
int

如果你需要记住价值观,你需要自己去做

我建议使用,带有一个记忆先前生成的素数的

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;
    }
}
将显示第一百万个素数:

15485863
已用时间:1.749469734秒
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");