2016-12-02 1 views
1

지금 람다를 배우고, 나는 몇 가지 자습서를 본 적이 그것은 간단한 예를 내놓았다 :"AssignmentOperator 표현"오류가

(int x) -> x + 5; 

하지만 내 컴파일러는이 오류를 보여주고있다 :

Syntax error, insert "AssignmentOperator Expression" to complete Expression 

나는 뭔가를 잊어 버렸습니까?

+0

당신은 람다와 아무것도하지 않는, 그리고 자바의 구문은 분명 아무것도하지 않는 문을 제외하려고합니다. – user2357112

+0

코드에서 기대하는 바는 무엇입니까? – Andreas

답변

3

람다 식은 항상 Functional Interafces (단일 추상 메서드 인터페이스라고도 함)의 참조 형식에 할당되어야합니다. 실제로, 그들은 단순한 익명 클래스 (단일 메소드 포함) 구현에 대한 지름길을 제공합니다.

간단히 말해서, 람다 표현식 = (함수 인터페이스의) 추상 메소드 구현.

는 예를 들어, 표현식은 아래의 기능 인터페이스에 할당 할 수 있습니다 :

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)를 알지 못합니다.
  • 코드 줄이 "선언문이 아닙니다"(컴파일러에서 자주 발생하는 다른 오류 메시지)입니다. 이것은이 같은 유사하다 : 유효한 자바하지

"Hello";

.

1

람다는 문장으로 사용할 수없는 표현식입니다. 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); 
관련 문제