2016-07-10 9 views
1

次のコードは、「素数の和」の数に制限を見つけるためにJava 8つのストリームとラムダを使用しています:次のJava 8パイプラインがEclipseで型の不一致を報告するのはなぜですか?

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

何が起こっているのですか? ...

答えて

1

私は何が起こっているのか分かりません。以前は長いストリームパイプラインの問題についても同様の質問がありましたが、人々がコマンドラインでも試してみたことは知らない。 問題は、状況によってはコンパイラが型を推測するのに十分な情報がないことです。トリックは、どちらか一方の方法でより多くの情報を提供することです。あなたの問題では、これは動作します:

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]) 
    ); 
} 
関連する問題