람다식이란 메서드를 하나의 식으로 표현한 것이다.
int getMaxVal(int a, int b){
return a>b?a:b;
}
위의 메서드는 정수 두개를 받아 더 큰값을 반환하는 메서드이다.
이를 람다식으로 표현하면 아래와 같다.
(a,b) -> a>b?a:b
위처럼 반환값이 있는 메서드의 경우 식의 연산 결과가 자동으로 반환값이 된다.
이 때, 문장이 아닌 식일 때는 끝에 ; 을 붙이지 않는것을 주의하자.
// 메서드 1
void printVar(String name, int i){
System.out.println(name + " = " + i);
}
// 람다식 1
(name, i) -> System.out.println(name + " = " + i)
// 메서드 2
int square(int x){
return x*x;
}
// 람다식 2
x -> x*x // 매개변수가 하나면 괄호 생략 가능
// 메서드 3
int roll(){
return (int)(Math.random()*6);
}
// 람다식 3
() -> (int)(Math.random()*6)
// 메서드 4
int sumArr(int[] arr){
int sum= 0;
for(int i : arr){
sum += i;
}
return sum;
}
// 람다식 4
// 식의 문장이 둘 이상일때는 {}와 ;을 쓴다. -> 즉, 한 문장 일때는 위의 예제처럼 생략 가능
(int[] arr) -> {
int sum= 0;
for(int i : arr){
sum += i;
}
return sum;
}
위의 람다식 예제를 보면 메서드의 이름과 반환값이 없어지는 것을 볼 수 있다.
따라서 람다식을 '익명함수 (anonymous function)' 이라고도 한다.
람다식은 메서드와 동등한것 같지만 사실 익명 클래스의 객체와 동일하다.
(a,b) -> a>b?a:b
new Object(){
int max(int a, int b){
return a>b?a:b;
}
}
위의 람다식과 익명 클래스를 구현한 객체는 동등하다는 의미이다.
따라서 람다식을 인터페이스를 통해 다루기로 했으며, 람다식을 다루기 위한 인터페이스를 함수형 인터페이스 라고 한다.
// 함수형 인터페이스
@FunctionalInterface
interface function1{
public abstract int max(int a, int b);
}
// 익명객체를 람다식으로 대체
function1 f = (a,b) -> a>b?a:b;
// 익명객체의 메서드 호출
int big = f.max(10,8);
위처럼 함수형 인터페이스를 정의해놓고 람다식을 통해 간단히 구현하는 것이다.
함수형 인터페이스에는 람다식과 인터페이스 메서드가 1:1로 연결되기 위해 하나의 추상 메서드만 정의되어야 한다.
@FunctionalInterface 어노테이션은 컴파일러가 함수형 인터페이스를 올바르게 정의했는지 확인하는 역할로, 꼭 붙이는게 좋다.