以下代码使用 Java 8 流和 lambda 来查找无限数量的“素数和”:
import java.util.stream.Stream;
public class FunctionalPrime {
public static void main(String[] args) {
printSumPrimes(6);
}
/**
* Given n>0, print all pairs i & j s.t. 1<=i<=j<=n and i+j is prime
*
* NOTE: This BREAKS in Eclipse because of some Eclipse bug!
* I had to compile it on the command-line using javac.
*
* @param n
*/
public static void printSumPrimes(int n) {
Stream.iterate(1, i -> i + 1)
.limit(n)
.flatMap(
i -> Stream.iterate(1, j -> j + 1).limit(n)
.filter(j -> i <= j)
.map(j -> new int[] { i, j }))
// .forEach(pair -> System.out.println("" + pair[0] + " " +
// pair[1]));
.filter(pair -> isPrime(pair[0] + pair[1]))
.forEach(
pair -> System.out.println("" + pair[0] + " + "
+ pair[1] + " = " + (pair[0] + pair[1])
+ " is prime"));
}
public static boolean isPrime(int n) {
return Stream.iterate(2, i -> i + 1)
.limit((long) Math.sqrt(n))
.noneMatch(i -> n % i == 0);
}
}
Eclipse 4.4.2 (BuildId 20150219-0600) 报告以下编译时错误:
- 表达式的类型必须是数组类型,但解析为 Object
但是相同的代码在命令行上运行良好:
发生什么事了? ...
最佳答案
我不确定发生了什么事。之前也有过关于长流管道问题的类似问题,但我不知道人们也在命令行上尝试过。 问题是,在某些情况下,编译器没有足够的信息来推断类型。诀窍在于,以一种或另一种方式提供更多信息。对于您的问题,这有效:
public static void printSumPrimes(int n) {
Stream<Integer> intstream = Stream.iterate(1, i -> i + 1).limit(n);
Stream<int[]> intarraystream = intstream.flatMap(i -> Stream
.iterate(1, j -> j + 1).limit(n).filter(j -> i <= j)
.map(j -> new int[] { i, j }));
intarraystream
.filter(pair -> isPrime(pair[0] + pair[1]))
.forEach(pair -> output(pair));
}
private static void output(final int[] pair) {
System.out.println(String.format(
"%1$s + %2$s = %3$s is prime",
pair[0], pair[1], pair[0] + pair[1])
);
}
关于java - 为什么以下 Java 8 管道在 Eclipse 中报告类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38291325/