使用java流查找数字是否为素数

使用java流查找数字是否为素数,java,java-stream,primes,java-9,Java,Java Stream,Primes,Java 9,我正在阅读破解编码访谈,其中有一个我在JShell上运行的查找素数的示例 boolean isPrime(int n) { for (int i = 2; i * i <= n; i++) { if (n % i == 0) { return false; } } return true; } 您应将其用作: boolean isPrimeStream(int n) { return IntStream.range(2, n) // not

我正在阅读破解编码访谈,其中有一个我在JShell上运行的查找素数的示例

boolean isPrime(int n) {
  for (int i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      return false;
    }
  }
  return true;
}
您应将其用作:

boolean isPrimeStream(int n) {
    return IntStream.range(2, n) // note  division by zero possible in your attempt
                    .noneMatch(i -> n % i == 0);
}
编辑:正如Andreas在评论中指出的,使用range2,n避免被零除,因为被1除总是导致条件为真,否则返回结果为假

返回此流的元素是否与提供的 谓词

您当前的代码正在使用

返回此流的任何元素是否与提供的 谓词

这就是为什么当任何输入满足指定的条件时,它会返回true,而不是当方法应该返回false时

如何执行与上面for循环类似的操作

具有或高于此级别,可以用作


问题一,您应该使用noneMatch而不是anyMatch。问题二,你的射程不在。使用rangeClosed或在末尾添加一个值,该值应该是n的平方根,而不仅仅是n-在第一次测试中,您以2作为初始值。此外,您还可以将该方法设置为静态。像

另外,我们可以通过将2作为特例处理来改进您的第一个示例。这允许您从三开始,然后以两个为增量,跳过所有偶数值

static boolean isPrime(int n) {
    if (n == 2) {
        return true;
    } else if (n == 1 || n % 2 == 0) {
        return false;
    }
    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

使用Java8流来完成这件事有什么意义。对我来说,你是在重新发明轮子。这一行就够了

BigInteger.valueOf(n).isProbablePrime(50);
还请注意,使用streams可以更好地解决一些问题。但这并不意味着stream是解决所有问题的灵丹妙药

以下是关于确定性的文档摘录

对于一个大的已知素数,以及任何大于0的确定性,它是否精确到 假设b.isProbablePrimeCancery总是返回true

static boolean isPrimeStream(int n) {
    return IntStream.rangeClosed(2, (int) Math.sqrt(n)) 
            .noneMatch(i -> n % i == 0);
}
static boolean isPrime(int n) {
    if (n == 2) {
        return true;
    } else if (n == 1 || n % 2 == 0) {
        return false;
    }
    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}
BigInteger.valueOf(n).isProbablePrime(50);