java - 为什么以下 Java 8 管道在 Eclipse 中报告类型不匹配?

标签 java eclipse

以下代码使用 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

但是相同的代码在命令行上运行良好:

Command-Line Compiles and Runs

发生什么事了? ...

最佳答案

我不确定发生了什么事。之前也有过关于长流管道问题的类似问题,但我不知道人们也在命令行上尝试过。 问题是,在某些情况下,编译器没有足够的信息来推断类型。诀窍在于,以一种或另一种方式提供更多信息。对于您的问题,这有效:

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/

相关文章:

java - JTextArea 文本可见性

java - java中如何给jpanel添加jpanel

java - 将 .pem 文件转换为 .p12 以在 ios 中推送通知

java - 使用附加写入文本文件 - java

java - 有像 JPA 3 这样的版本吗?

javascript - Maven 元素中的 CSS 和 JS 文件位置

java - 通过java代码记录用户选择并更改textview字符串

java - 不兼容的类型 : inference variable T has incompatible bounds equality constraints: capture#1 of ? 扩展了 java.lang.Object

Eclipse 动态 Web 项目未在 tomcat 服务器上运行

java - 以编程方式生成 Solr (Lucene) 查询字符串