1. 람다식이란?
- 함수를 간단한 Expression으로 표현하는 방법
int max(int a, int b) {
return a > b ? a : b
}
(a, b) -> a > b ? a : b
- 익명 함수라고 불림
- 함수와 메소드의 차이는 근본적으로 동일
- 함수는 클래스에 독립적
- 메소드는 클래스에 종속적
2. 람다식 작성하기
1. 메소드의 이름과 반환타입을 제거하고 '->'를 블록{} 앞에 추가
X int max X(int a, int b) -> {
return a > b ? z : b
}
2. 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능
(int a, int b) -> a > b ? a : b
3. 매개 변수의 타입이 추론 가능하면 생략가능
(a, b) -> a > b ? a : b
3. 작성 주의사항
a -> a * a
- 블록 안의 문장이 하나일 때 괄호() 생략가능
(int i) -> {
System.out.println(i)
}
(int i) -> System.out.println(i)
- 단, 하나뿐인 문장이 return문이면 괄호 생략 불가
4. 함수형 인터페이스(1/3)
(a, b) -> a > b ? a : b
new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
}
- 함수형 인터페이스 : 단 하나의 추상 메소드만 선언된 인터페이스
- 함수형 인터페이스 타입의 참조 변수로 람다식을 참조할 수 있음
MyFunc f = (a, b) -> a > b ? a : b
int val = f.max(3, 5)
5. java.util.function 패키지
- Supplier : 매개변수 X, Return O
- Consumer : 매개변수 O, Return X
- Function : 매개변수 O, Return O
- Predicate : 매개변수 하나만, Return Boolean
6. 메소드 참조(Method reference)
- 하나의 메소드만 호출하는 람다식은 '메소드 참조'로 간단히 할 수 있다
- 람다 표현식이 단 하나의 메소드만 호출하는 경우 해당 람다 표현식에서 불필요한 매개변수 제거하고 사용
클래스이름::메소드 이름
참조변수이름::메소드 이름
(base, exponent) -> Math.pow(base, exponent)
Math::pow
MyClass obj = new MyClass();
Function<String, Boolean> func = (a) -> obj.equal(a);
Function<String, Boolean> func = obj::equal(a);
oper = (n) -> Math.abs(n);
oper = Math::abs;