1. 특징
- 익명: 구현해야 할 코드 감소
- 함수: 메서드와 달리 특정 클래스에 종속되지 않음, 메서드 처럼 파라미터 리스트, 바디, 반환 형식 가능한 예외 리스트를 포함
- 전달: 람다 표현식을 메서드 인수로 전달, 변수로 저장 가능
- 간결성: 코드 간결화
2. 람다 표현식의 구성
- 파라미터 리스트.
- 화살표: 람다의 파라미터 리스트와 바디를 구분.
- 람다 바디: 반환값.
기본 표현식: (parameters) -> expression
블록 스타일: (parameters)-> { statements; }
3. 람다 사용
3.1 함수형 인터페이스(@FunctionalInterface)
정의: 정확히 하나의 추상 메서드를 지정하는 인터페이스
사용: 전체 표현식을 함수형 인터페이스의 인스턴스로 취급
- Predicate: Boolean check
https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
- Consumer: 리턴 값이 없는 accept 메소드, 객체를 받아 소비
https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html
- Function: 제네릭 형식 T를 받아 제네릭 형식 R 객체를 반환하는 추상 메서드 apply.
https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
3.2 함수 디스크립터
정의: 람다 표현식의 시그니처를 서술하는 메서드를 함수 디스크립터
Ex) 메서드 시그니처 boolean test(T t) / 함수 디스크립터 T -> boolean
4. 형식 검사, 형식 추론, 제약
- 형식 검사: 람다가 사용되는 context를 이용하여 람다의 형식을 추론.
- 형식 추론: 개발자가 스스로 어떤 코드가 가독성을 향상시키는 지 결정.
- 지역 변수 사용: 람다는 한 번만 할당할 수 있는 지역 변수만 캡쳐
> 인스턴스 변수: 힙 / 지역 변수: 스택
- 클로저와 차이: 지역 변수 변경 유무(람다의 지역 변수는 final)
5. 람다 메소드 참조에 활용
- 1단계: 코드 전달
1
2
3
4
5
6
7
|
public class AppleComparator implements Comparator<Apple> {
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a23.getWeight());
}
}
inventory.sort(new ApleComparator());
|
- 2단계: 익명 클래스 사용
1
2
3
4
5
|
inventory.sort(new Comparator<Apple>() {
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
});
|
- 3단계: 람다 표현식 사용
1
|
inventory.sort(comparing(apple -> apple.getWeight()));
|
- 4단계: 메소드 참조 사용
1
|
inventory.sort(comparing(Apple::getWeight));
|
6. 람다 표현식 메서드
6.1 Comparator 조합
- 역정렬: reversed()
- 연결: thenComparing();
6.2 Predicate 조합
- 반전: .negate
- &&: .and
- ||: .or
6.3 Function 조합
- andThen: 주어진 함수를 먼저 적용한 결과를 다른 함수의 입력으로 전달하는 함수를 반환
- compose: 인수로 주어진 함수를 먼저 실행한 다음에 그 결과를 외부 함수의 인수로 제공
다양한 파이프라인 생성 가능
참고: 모던 자바 인 액션
'- Java' 카테고리의 다른 글
Stream 기능 (0) | 2020.10.24 |
---|---|
Stream 기본 (0) | 2020.10.20 |
final / static final (0) | 2020.07.21 |
Map to Json, Json to Map + ObjectMapper + Gson (0) | 2020.07.17 |
SimpleDateFormat 사용법 및 UTC 관련 (0) | 2020.06.29 |