@FunctionalInterface // 함수형 인터페이스라는 의미. 메서드가 2개 이상 선언되면 오류를 체크해줌
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); // 실제로는 람다식(익명 함수)이 호출 됨
@FunctionalInterface
interface Comparator<T>{
int compare(T o1, T o2);
}
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);
}
});
위에서 선언한 익명 객체를 아래와 같은 람다식으로 변경할 수 있다.
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
@FunctionalInterface
interface MyFunction{
void myMethod();
}
void aMethod(MyFunction f){
f.myMethod(); // MyFunction에 정의된 메서드 호출
}
호출하는 코드는 다음과 같다.
MyFunction f () -> System.out.println("myMethod()");
aMethod(f);
위의 문장을 아래와 같이 한 줄로 표현할 수도 있다.
aMethod(() -> System.out.println("myMethod()"));
// 람다식 반환
MyFunction myMethod(){
MyFunction f = () -> {};
return f;
}
위의 문장을 아래와 같이 한줄로 표현할 수도 있다.
MyFunction myMethod(){
return ()->{};
}