람다식 Lambda Expression
- 함수(메서드)를 간단한 ‘식’으로 표현하는 방법이다.
(a, b) -> a>b ? a: b
- 익명 함수 anonymous function
- 함수와 메서드의 차이점
- 근본적으로 동일하지만,
- 함수 : 일반적인 용어. 클래스에 독립적
- 메소드 : 객체지향개념의 용어이다. 클래스에 종속적이다.
- 근본적으로 동일하지만,
람다식 사용법
- 호출해서 사용하는 방식이 아닌, 구현부에서 바로 함수처리를 하여 내부에서 직접 기능을 처리하는 방식
- 반환 타임과 이름을 지운다. ()와 {} 사이에 화살표로 연결한다.
- 반환값이 있는 경우 식이나 값만 적고 return, ; 생략 가능
- 매개변수의 타입이 추론 가능하면 대부분 생략 가능하다.
// 작성실습
int max(int a, int b) {
return a>b? a:b;
}
(a,b) -> a>b ? a : b
- 람다 사용시 반드시 함수형인터페이스를 먼저 정의해야 한다.
함수형 인터페이스
- 단 하나의 추상 메서드만 선언된 인터페이스
- @FunctionalInterface 를 클래스에 붙여준다.
- 없어도 되지만, 클라이언트에게 함수형 인터페이스를 표현할 수 있으며 조건 충족을 검사할 수 있다.
- 조건에 충족하지 않으면 컴파일 에러가 발생한다.
**@FunctionalInterface**
interface MyFuntion{
public abstract int max(int a, int b);
}
MyFunction f = new MyFunction() { // 사용 방법
public int max(int a, int b) {
return a>b ? a:b;
}
}
// 람다식을 참조할 수 있다.
MyFunction f = (a,b) -> a>b ? a:b;
int value = f.max(3,5); //
- Java에서 자주 사용되는 함수형 인터페이스 java.util.function
- 표 외에도 더 많다. 공식문서 참고자료
Function<T, R> | T -> R |
BiFunction<T,U,R> | T,U -> R |
Consumer | T -> () |
Supplier | () -> T |
Predicate | T -> boolean |
UnaryOperator | Function<T,T> 와 같음. T -> T |
BinaryOperator | BiFunction<T,T,T>와 같음. T, T -> T |
문법
- 매개변수가 1개인 경우, 타입 없다면 생략 가능
- 블록 안에 문장이 하나라면 {} 생략 가능. 끝에 ; 안 붙여도 된다.
람다식의 특징과 장점
- 익명 함수
- 특정 클래스에 종속되지 않는 함수이다.
- 익명 객체Object이다.
- 자바에서는 메소드만 존재할 수 없으니까 이를 객체로 다루기 위해선 함수형 인터페이스가 필요하다.
- 전달이 가능하다.
- 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다.
- 간결해져 가독성이 향상된다.
- 멀티 스레드 환경에서 용이하다. (함수형 프로그래밍의 특징)
람다의 단점
- 람다로 인한 무명함수는 재사용이 불가능하다. (항상 새 인스턴스로 할당해야 한다.)
- 디버깅이 좀 힘들다.
- 무분별한 람다 사용은 코드 가독성을 해친다.
- 재귀로 만들기 부적합하다.