본문 바로가기

- Java

lambda

반응형

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

 

Predicate (Java Platform SE 8 )

Returns a composed predicate that represents a short-circuiting logical AND of this predicate and another. When evaluating the composed predicate, if this predicate is false, then the other predicate is not evaluated. Any exceptions thrown during evaluatio

docs.oracle.com

                - Consumer: 리턴 값이 없는 accept 메소드, 객체를 받아 소비

                https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html

 

Consumer (Java Platform SE 8 )

andThen default Consumer  andThen(Consumer  after) Returns a composed Consumer that performs, in sequence, this operation followed by the after operation. If performing either operation throws an exception, it is relayed to the caller of the composed op

docs.oracle.com

                - Function: 제네릭 형식 T를 받아 제네릭 형식 R 객체를 반환하는 추상 메서드 apply.

                https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html

 

Function (Java Platform SE 8 )

 

docs.oracle.com

    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