메서드의 이름과 반환타입을 제거하고, '->'를 블록{ } 앞에 추가한다.

반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능(끝에 ';'안 붙임)

매개변수의 타입이 추론 가능하면 생략가능(대부분의 경우 생략 가능)

매개변수가 하나인 경우, 괄호( ) 생략가능(타입이 없을 때만)

블록안의 문장이 하나뿐 일 때, 괄호{ } 생략 가능(끝에 ';' 안 붙힘)


Object obj = new Object(){
int max(int a, int b) {
return a > b > a : b
}
}
obj = (a, b) -> a > b ? a : b // obj : 참조변수
int value = obj.max(3,5); // 에러. Object클래스에 max()가 없음
class Java {
public static void main(String[] args) {
// Object obj = (a,b) -> a > b ? a : b // 람다식. 익명객체. 뭔가 필요. 없어서 오류
Object obj = new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
};
int value = obj.max(3,5); // 함수형 인터페이스
}
}
interface MyFunction { // 이걸
public abstract int max(int a, int b);
}
MyFunction f = new MyFunction() { // 이렇게 익명클래스로 클래스의 선언, 객체생성 동시
public int max(int a, int b) {
return a > b ? a : b
}
]
int value = f.max(3,5); // ok. MyFunctino에 max()가 있음
MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3,5); // 실제로는 람다식(익명함수)이 호출됨

void aMethod(MyFunction f) {
f.myMethod(); // MyFunction에 정의된 메서드 호출
}
@FunctionalInterface
interface MyFunction(){
void myMethod();
}
MyFunction f = () -> System.out.println("myMethod()"); // 이 함수 두줄을
aMethod(f);
aMethod(() -> Systme.out.println("myMethod()")); // 이렇게 한줄로 변환
MyFunction myMethod() { // 이 함수를
MyFunction f = () -> { };
return f;
}
MyFunction myMethod() { // 이렇게 줄일 수 있음
return () -> { };
}
( ) -> ~~~ : 람다식