2016-11-14 39 views
0

我正在玩月蝕氧氣中的lambda。我有這樣的代碼Eclipse提取方法不適用於Lambdas

@FunctionalInterface 
interface TriFinction<O,I,J, R> { 
    R whatEver(O object, I input1, J input2); 
} 

class Dummy { 
    public String dothingsWithTwoArgs(String a, String b) { 
     return a+b; 
    } 
} 

public class LambdaTest { 
    public static void main(String[] args) { 
     Dummy::dothingsWithTwoArgs; 
    } 
} 

我無法提取Dummy :: dothingsWithTwoArgs。 Eclipse正在顯示編譯錯誤語法錯誤,請插入「AssignmentOperator表達式」以完成表達式,但提取在intellij中完美運行。在eclipse中有沒有解決這個問題的方法?

回答

0

首先,我們注意到,您的dothingsWithTwoArgs也不是一成不變的,因此,你不應該試圖調用它在一個靜態的方式:你應該用你的虛擬類的實例,或使dothingsWithTwoArgs靜態

這裏有一些插圖,這將讓你去

首先,你需要有你的TriFinction作爲其參數

實例的一個方法:

public static String sumToString(String a,String b, String c, TriFinction<String,String,String,String> f) { 
     return f.whatEver(a, b, c); 
    } 

其次,在啞類你需要一個你TriFinction的genric簽名相匹配方法(這意味着,例如,它接收三個參數爲O,J和I和它返回一個R)

例如

public static String dothingsWithThreeArgs(String a, String b,String c) { 
      return a+ " " + b + " " + c; 
     } 

現在你可以在你的主要方法使用的方法例如參考:

System.out.println(sumToString("2","3","4",Dummy::dothingsWithThreeArgs)); 

這裏是您TriFinction第二插圖沿着完整的例子(我猜你應該重構,重新命名爲三官能:))

public class ExtractWithLambda { 
    @FunctionalInterface 
    interface TriFinction<O,I,J, R> { 
     R whatEver(O object, I input1, J input2); 
    } 

    public static String writeEqu(TriFinction<Double,Double,Double,String> f) { 
      return f.whatEver(2.5, 3.4, 5.6); 
    } 

    public static String sumToString(String a,String b, String c, TriFinction<String,String,String,String> f) { 
     return f.whatEver(a, b, c); 
    } 

    public static void main(String[] args) { 
     System.out.println(writeEqu(Dummy::writeEquation)); 
     System.out.println(sumToString("2","3","4",Dummy::dothingsWithThreeArgs)); 
    } 

} 

class Dummy { 
     public static String dothingsWithThreeArgs(String a, String b,String c) { 
      return a+ " " + b + " " + c; 
     } 

     public static String writeEquation(double a, double b, double c) { 
      return a + "*x*x " + b + "*x " + c ; 
     } 
    } 
+0

感謝您的回覆。我不希望代碼工作。我只需要知道爲什麼日食沒有提取到一個變量。當我在intellij中按Ctrl + Shift + l時,它將它提取到「TriFinction dothingsWithTwoArgs = Dummy :: dothingsWithTwoArgs;」。我認爲方法引用也適用於非靜態方法。例如String :: toLowerCase –

0

我們應該知道一個主要的事情是編譯錯誤消息編譯器依賴。這確實意味着不同的編譯器會產生不同的錯誤信息所有的時間。但可能會有情況。

關於您的問題,我發現這answerpost。該帖子在主題下有關此錯誤的詳細說明不是一個聲明

所以重點是這個。至於你提到的這個錯誤消息是具體的Eclipse編譯器。編譯器提出的要點是您的行只是一個表達式,不是一個語句。爲了將它理解爲一個聲明,編譯器希望你爲添加一個賦值運算符。這就是insert "AssignmentOperator Expression" to complete Expression的全部含義。所以你所要做的只是將該行分配給另一個定義的變量,看起來像這樣。

someVariable = Dummy::dothingsWithTwoArgs; 

希望你能找到更深入,與我提到的來源更多的例子。 :))

相關問題