@FunctionalInterface
interface Calculator {
    int sumTwoNumber(int x, int y);
}
 
public class Application {
    public static void main(String[] args) {
        Calculator c3 = (x, y) -> x + y;
        System.out.println("40과 50의 합은 : " + c3.sumTwoNumber(40, 50));
    }
}
 
  • put a functional interface (함수형 인터페이스)
@FunctionalInterface
interface ExampleFunction {
    int sum(int num1, int num2);
}
 
public class LamdaExample1 {
    public static void main(String[] args) {
        ExampleFunction exampleFunction = (num1, num2) -> num1 + num2;
        System.out.println(exampleFunction.sum(10, 15));
    }
}
 
// 출력값: 25
  • 함수형 인터페이스는 하나의 기능만을 명확하게 정의하기 위한 용도이기 때문에, 두 개 이상의 추상 메서드가 존재하면 컴파일 에러가 발생하거나 람다식으로 사용할 수 없다.
  • @FunctionalInterface 어노테이션을 붙이면 컴파일러가 규칙을 강제한다.
    • 이 어노테이션은 선택 사항이지만, 붙여두면 해당 인터페이스가 실제로 함수형 인터페이스 규칙을 따르고 있는지 컴파일 시점에 검사하게 된다.
  • 람다식은 인터페이스의 추상 메서드와 정확히 1:1로 매칭되어야 한다.
    • 함수형 인터페이스는 하나의 추상 메서드만 가지므로, 람다식은 해당 추상 메서드의 시그니처(매개변수 타입, 개수, 리턴 타입 등)와 정확히 일치해야 한다.

Calculator cal3 = (a,b) -> a + b;
System.out.println(cal3.sumTwoNumber(10,10));
  • 알아서 매핑이 됨

  • lambda에서 외부 변수는 final, effective final만 사용가능

  • 왜 람다는 functional interface를 써야만 하느냐

    • 람다는 인스턴스를 만드는거임
    • 근데 람다는 abstract function을 1개 밖에 override 못함
    • 그래서 functional interface (1 abstract method) is a must use for lambda
  • 이름이 없는 익명 객체가 variable에 assign 되는거임