기존의 메소드를 더 쉽게 표현한 것으로 반환타입과 이름을 지우고 '->' 를 넣는 형태로 이루어져 있다. 메소드의 이름이 없고 자바에서 메소드는 혼자 존재할 수 없기때문에 '익명객체'라고도 칭한다.
메소드와 함수는 동일하나, 클래스에 종속되어있으면 메소드, 종속되어있지 않으면 함수라고 칭한다. (자바에서는 항상 클래스에 종속되어있기에 메소드만 존재한다.)
// 기존의 함수
int max(int a, int b) {
return a > b ? a : b;
}
// 람다식
(int a, int b) -> {
return a > b ? a : b;
}
// 람다식
(int a, int b) -> {
return a > b ? a : b;
}
// 더 축약한 람다식
(int a, int b) -> a > b ? a : b
// 더 더 축약한 람다식
(a, b) -> a > b ? a : b
(a) -> a + a
(int a) -> a + a
a -> a + a // 가능
int a -> a + a //불가능, 타입이 있어서 ()로 묶어줘야 한다.
(int i) -> {
System.out.println(i);
}
(int i) -> System.out.println(i)
상단에서 익명함수가 아니라 객체라고 설명했는데
즉, 아래의 람다식 자체가 객체라는 뜻이다.
(a, b) -> a> b ? a : b
이 객체를 사용하기 위해 Object로 선언후 사용하게 되면 에러가 뜨고
이것을 해결하기 위해 함수형 인터페이스가 나왔다.
new Object(){ // 객체의 선언과 생성을 동시에(익명 클래스)
(a, b) -> a> b ? a : b
}
}
"단 하나"의 추상메소드만 선언된 인터페이스로
선언시 @FunctionalInterface 를 붙이면 에러를 잡아준다.
@FunctionalInterface //interface에러 잡아준다.
interface MyFunction {
// 인터페이스의 모든 메서드는 public 이면서 abstract 이기 때문에 생략 가능
public abstract int max(int a, int b);
}
위와 같이 함수형 인터페이스를 선언하면 아래와 같이 람다식을 사용할 수 있다.
이때 아래 2개의 코드는 동일 코드이다.
MyFunction f = new MyFunction() {
public int max(int a, int b){
return a > b? a:b;
}
};
int value = f.max(3,5);
@FunctionalInterface
// 람다식(익명 객체)을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.
MyFunction f= (a, b) -> a>b ? a:b;
int value = f.max(3,5)
출처: [자바의 정석 - 기초편] ch14-1~4 람다식이란? 람다식 작성하기, 남궁성
[자바의 정석 - 기초편] ch14-5,6 함수형인터페이스, 남궁성