在Java 8中将while循环转换为流

sco*_*ent 4 java functional-programming java-8 java-stream

作为练习,我将一些旧代码转换为功能流。我对流了解不多。似乎转换此代码应该很简单,但是我运气不高。该方法从给定的整数开始,将其传递给isPrime,如果为素数则返回true。然后递出要打印的新(下一个)素数。如果isPrime为false,则我递增,然后检查下一个整数。

private static int nextPrime(final int number) {
    int i = number + 1;

    while (!isPrime(i)) {
        i++;
    }

    return i;
}
Run Code Online (Sandbox Code Playgroud)

Jac*_* G. 6

Stream除了充分利用并行性外,我没有其他理由使用a (如果质数恰好相距很远,但是在int界限内不会如此,因此基本上没有好处)。

您可以迭代一个IntStream递增的整数(从开始number + 1),并且仅过滤质数。不可避免地找到一个时,您可以返回第一个。

private static int nextPrime(final int number) {
    return IntStream.iterate(number + 1, i -> i + 1)
                    .filter(Test::isPrime)
                    .findFirst()
                    .getAsInt();
}
Run Code Online (Sandbox Code Playgroud)

注意:我用来测试它的类称为Test,如方法参考所示。您应该将其更改为您的班级名称。

  • 我更喜欢`IntStream.rangeClosed(number + 1,Integer.MAX_VALUE)`; 它更有效,并且当没有更大的质数时抛出NoSuchElementException的行为比溢出更合理…… (3认同)
  • 我意识到没有需要流。我只是想学习函数式编程,以转换我知道已经可以使用的代码。您提供的代码有很大帮助。我正在慢慢解决这个问题。 (2认同)