//변환 전
int max(int a,int b) {
return a > b ? a : b
//변환 후
(a, b) -> a > b ? a : b
람다식은 함수인지 객체인지 헷갈릴 수 있지만, 익명 클래스의 객체이다.
(a, b) -> a > b ? a : b //람다식
-> new Object() {
int max(int a,int b) {
return a > b ? a : b;
위의 식을 기준으로 람다식으로 정의된 익명 객체의 메서드를 어떻게 호출 할 것인가?를 위하여 익명 객체의 주소를 f라는 참조 변수에 저장한다.
MyFuntion f = new MyFuntion() {
public int max(int a, int b){
return a > b ? a : b;
int bing = f.max(5, 3);
// 익명 객체의 메서드를 호출
위의 MyFuntion인터페이스에 정의된 메서드 max()를 람다식으로 표현할수 있기에 바꿔주면 아래와 같이 할 수 있다.
MyFuntion f = (int a, int b) -> a > b ? a : b;
// 익명 객체를 람다식으로 대체
int big = f.max(5, 3);
함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 하는 제약이 있다. 그래야만, 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다. static메서드와 default메서드의 개수에는 제약이 없다.
@FunctionalInterface
//@FunctionalInterface를 붙이면,
//컴파일러가 함수형 인터페이스를 올바르게 정의하였는지 확인해준다.
interface MyFunction { //추상 메서드는 1개만 가능
public abstract int max(int a, int b);
메서드의 매개변수가 MyFunction타입이면, 메서드를 호출할 때
"람다식을 참조하는 참조변수를 매개변수"로 지정해야한다.
@FunctionallInterface
interface MyFunction{
void myMethod(); //추상 메서드 public abstract void myMethod();
}
void aMethod(MyFunction f){ //매개변수의 타입이 함수형 인터페이스
f.MyMethod(); //MyFinction에 정의된 메소드 호출
}
~~~(생략)
MyFunction f = return ()->{};
aMehod(()-> System.out.println("MyMethod()")); //람다식을 매개변수로 지정
람다식의 타입과 형변환
함수형 인터페이스로 람다식을 참조할 수 있는 것일 뿐,
람다식의 타입과 함수형 인터페이스의 타입이 일치하는 것은 아니다.
MyFunction f = (MyFunction)(() -> {});
//양변의 타입이 다르므로 형변환이 필요, 생략가능