2016-12-02 23 views
1

我現在學習的λ,我已經看到了一些教程,並想出了一個簡單的例子:「AssignmentOperator表達」錯誤

(int x) -> x + 5; 

但我的編譯器顯示此錯誤:

Syntax error, insert "AssignmentOperator Expression" to complete Expression 

我忘了什麼嗎?

+0

你不是做與拉姆達什麼,和Java的語法儘量排除語句顯然沒有做任何事情。 – user2357112

+0

你期待該代碼做什麼? – Andreas

回答

3

Lambda表達式總是必須分配給功能性Interafces(也稱爲單抽象方法接口)的引用類型。事實上,它們爲詳細的匿名類(使用單一方法)實現提供了捷徑。

因此,簡而言之,Lambda表達式=抽象方法實現(功能接口)。

例如,你的表情可以分配給下面的功能接口:

public interface MyInterface {//define Functional Interafce (SAM) 
    public int someMethod(int a); 
} 

public class Test { 
    public static void main(String[] args) { 
     MyInterface myInterface = (int a) -> a +5;//assign the expression to SAM 
     int output = myInterface.someMethod(20)); //returns 25 
    } 
} 
0

的問題,如上面所指出的,你是不是做與拉姆達什麼。這意味着:

  • 編譯器不知道哪個函數接口(例如java.util.function.Function)推斷爲您的lambda的類型。
  • 你的代碼行是「不是語句」(編譯器經常發出的另一個錯誤消息)。這是類似這樣的:

"Hello";

這是不是有效的Java。

1

Lambdas是不能用作語句的表達式。從JLS8 §15.27

It is a compile-time error if a lambda expression occurs in a program in someplace other than an assignment context (§5.2), an invocation context (§5.3), or a casting context (§5.5).

考慮這個例子:

// functional interface 
interface Operator 
{ 
    int apply(int a, int b); 
} 
// method that expects instance of the interface 
int calculate(int a, int b, Operator op) 
{ 
    return op.apply(a, b); 
} 
// lambda expression 
Operator plus = (a, b) -> a + b; 
// method call 
calculate(40, 2, plus);