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()方法来轻松规避,但有没有办法为素数因子做同样的事情,但只能用一个方法?
如果您想在不借助现有素数测试方法的情况下用单一方法执行此操作,您可以这样做
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n您可以测试该方法,例如
\n\nIntStream.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}\nRun Code Online (Sandbox Code Playgroud)\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n不用说,这不是\xe2\x80\x99t最有效的方法\xe2\x80\xa6
\n| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |