기존
int max(int a, int b) {
return a > b ? a : b;
}
를
(a, b) -> a > b ? a : b
로 나타낼 수 있다.
int max(int a, int b) {
return a > b ? a : b;
}
대신
(int a, int b) -> {
return a > b ? a : b;
}
cf) 함수와 메서드의 차이
근본적으로 동일하지만 함수는 일반적 용어, 메서드는 객체지향 개념 용어이다.
함수는 클래스에 독립적이고, 메서드는 클래스에 종속적이다.
다만 자바에서는 함수가 클래스 밖에 있을 수 밖에 없으므로 메소드밖에 존재하지 않는다.
따라서
int max(int a, int b) {
return a > b ? a : b;
}
를
(a, b) -> a > b ? a : b
로 나타낼 수 있다.
매개변수가 하나인 경우, 괄호 생략 가능. 단, 타입이 없을 때만 가능하다.

블록 안의 문장이 하나 뿐일 때 괄호 생략 가능. 또한 ;도 붙이지 않는다.
하나뿐인 문장이 return 문이면 괄호를 생략할 수 없다.


자바에서는 메서드만 따로 존재할 수 없기 때문에 람다식은 익명 함수가 아니라 익명 객체이다.
(a, b) -> a > b ? a : b
는 사실
new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
}
와 같다.
익명 객체: 객체의 선언과 생성을 동시에 한다.
람다식은 객체이므로 람다식을 다루기 위한 참조변수가 필요하다.
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);
위 문장을 호출 시 에러가 발생한다. Object 클래스(리모컨 역할)에는 max()가 없기 때문이다.
이를 해결하기 위해 필요한 것이 함수형 인터페이스이다.
@FunctionalInterface
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. MyFunction에 max()가 있기 때문
MyFunction f = (a,b) -> a > b ? a : b;
int value = f.max(3,5); // 실제로는 람다식이 호출됨.
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return s2.compareTo(s1);
)
});
를
interface Comparator<T> {
int compare(T o1, T o2);
}
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
로 대체할 수 있다.
void aMethod(MyFunction f) {
f.myMethod(); // MyFuction에 정의된 메서드 호출
}
즉 매개변수로 함수형 인터페이스 타입을 받는 것은 매개변수로 람다식을 받는 것과 같다.
MyFunction f = () -> System.out.println("myMethod()");
aMethod(f);
혹은
aMethod(() -> System.out.println("myMethod()"));
으로 호출할 수 있다.
MyFunction myMethod() {
MyFunction f = () -> {};
return f;
}
=
MyFunction myMethod() {
return () -> {};
}