使用单一方法获取功能Java流中的主要因素?

Car*_*ein 8 java lambda primes functional-programming java-stream

此方法将接收Long并返回LongStream传递给方法的任何数字的素数.

factors.java

public LongStream factors(long x){
  LongStream factorStream = LongStream.range(1, x+1).filter(n -> x%n == 0);
  return factorStream;
}
Run Code Online (Sandbox Code Playgroud)

利用上述方法找到共同的因素首先是OK.

primeFactors.java

public LongStream primeFactors(long x){
  LongStream primeFactorStream = factors(x).filter(n -> factors(n).count() == 0); 
  //doesn't work as factors.java returns a LongStream, which might include non-prime factors, which will not equate to zero.
  return primeFactorStream;
}
Run Code Online (Sandbox Code Playgroud)

我理解这应该通过使用带谓词的简单isPrime()方法来轻松规避,但有没有办法为素数因子做同样的事情,但只能用一个方法?

Hol*_*ger 3

如果您想在不借助现有素数测试方法的情况下用单一方法执行此操作,您可以这样做

\n\n
public static LongStream primeFactors(long x) {\n    return LongStream.rangeClosed(2, x)\n                     .filter(n -> x % n == 0)\n                     .filter(n -> LongStream.rangeClosed(2, n/2).noneMatch(i -> n%i==0));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以测试该方法,例如

\n\n
IntStream.concat(IntStream.rangeClosed(2, 15), IntStream.rangeClosed(90, 110))\n         .forEach(number -> System.out.printf("%3d = %s%n", number,\n            primeFactors(number)\n                .mapToObj(d -> {\n                    int p = 0;\n                    for(long l = number; l%d == 0; l /= d, p++) l++;\n                    return p == 1? String.valueOf(d): d + "^" + p;\n                })\n                .collect(Collectors.joining(" * ")))\n         );\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
public static LongStream primeFactors(long x) {\n    return LongStream.rangeClosed(2, x)\n                     .filter(n -> x % n == 0)\n                     .filter(n -> LongStream.rangeClosed(2, n/2).noneMatch(i -> n%i==0));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

不用说,这不是\xe2\x80\x99t最有效的方法\xe2\x80\xa6

\n