정의
- 한 번 이상 실행할 수 있는 코드 블록 { } 이라고 하는데... 일단 샘플을 봐보자.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
//기존 선언 방식
Runnable task = new Runnable() {
@Override
public void run() {
}
};
//람다 표현식을 사용해한 선언 방법
Runnable task = () -> doSomething(); //식이 간단한 경우
Runnable task = () -> { do1(); do2(); } //식이 복잡한 경우 괄호 { }를 통해서 작성
위 코드에서 Runnable처럼 추상 메서드가 한 개만 있는 인터페이스를 함수형 인터페이스라고 하는데
람다 표현식을 통해 함수형 인터페이스(Funtional Interface)구현을 대체할 수 있다.
Runnable의 run메소드 처럼 파라미터와 return값이 없는 간단한 함수 뿐만 아니라 파라미터가 있거나 return값이 있는 함수들도 표현이 가능하다.
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
//Comparator인터페이스의 일부 코드
}
//파라미터의 티입을 명시하는 경우
Comparator<String> stringComparator = (String s1, String s2) -> {
s1.length();
s2.length();
return 1;
};
//파라미터의 티입을 생략하는 경우
Comparator<String> stringComparator = (s1, s2) -> {
s1.length();
s2.length();
return 1;
};
Comparator 인터페이스는 하나의 추상 메소드인 Compare(...)를 가지고 있기 때문에
위 코드처럼 람다 표현식으로 대체가 가능하다.
함수형 인터페이스는 추상 메소드가 하나이고
람다 표현식으로 작성되는 이 함수의 구현에서는 파라미터의 타입이 짐작이 가능하다.
그래서 람다 표현식을 작성하는 경우 아래쪽 코드처럼 s1, s2의 타입을 생략하는 것도 가능하다.
만약 파라미터가 한개라면 괄호 '( )'도 생략이 가능하다.