람다식이 익숙치 않을땐 진짜 저게뭐지 했는데
눈에 익으니까 직관적이고 편한것같다.
+) 이클립스에서 블럭 선택 후 Alt + Shitf + m 단축키를 누르면
편하게 메소드 생성이 가능함
예~전에 재택근무할때 대표님이 코드리뷰 해주시면서 알려주셨는데
까마득하게 잊고있다가 부사수님이 물어보셔서 겨우기억해냈당
자바의정석 Chapter 14. 람다와 스트림
자바에서 모든 메서드는 클래스 내에 포함되어야 한다.지금까지 람다식이 메서드와 동등한 것처럼 설명해왔지만, 사실 람다식은 익명 클래스의 객체와 동등하다.
(int a, int b) -> a > b ? a : b →
new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
}
람다식으로 정의된 익명 객체의 메서드를 어떻게 호출할 수 있을 것인가? 참조변수가 있어야 객체의 메서드를 호출 할 수 있으니까 일단 이 익명 객체의 주소를 f라는 참조변수에 저장해 보자.
타입 f = (int a, int b) -> a > b ? a : b;
그렇다면 참조변수 f의 타입은 어떤 것이어야 할까? 참조형이니까 클래스 또는 인터페이스가 가능하다. 그리고 람다식과 동등한 메서드가 정의되어 있는 것이어야 한다. 그래야만 참조변수로 익명 객체(람다식)의 메서드를 호출할 수 있기 때문이다.
인터페이스
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 big = f.max(5,3); // 익명 객체의 메서드 호출
위 코드의 익명 객체를 람다식으로 대체
MyFunction f = (int a ,int b) -> a > b ? a : b;
int big = f.max(5, 3);
이처럼 MyFunction인터페이스를 구현한 익명 객체를 람다식으로 대체가 가능한 이유는, 람다식도 실제로는 익명 객체이고, MyFunction인터페이스를 구현한 익명 객체의 메서드 max()와 람다식의 매개변수의 타입과 개수 그리고 반환값이 일치하기 때문이다.
하나의 메서드가 선언된 인터페이스를 정의해서 람다식을 다루는 것은 기존의 자바의 규칙들을 어기지 않으면서도 자연스럽다.
그래서 인터페이스를 통해 람다식을 다루기로 결정되었으며, 람다식을 다루기 위한 인터페이스를 '함수형 인터페이스'라고 부르기로 했다.
@FunctionalInterface → 컴파일러가 함수형 인터페이스를 올바르게 정의하였는지 확인해준다.
interface MyFunction {// 함수형 인터페이스 MyFunction을 정의
public abstract int max(int a, int b);
}
단, 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 한다. 그래야 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있다. 반면에 static메서드와 default메서드의 개수에는 제약이 없다.