람다 표현식(Lambda) 알고 사용하기 - 응용편

주리링·2022년 5월 2일
0

모던 자바 인 액션

목록 보기
3/3
post-thumbnail

이번 포스팅에선 람다식을 더 가독성 있게 표현할 수 있는 메서드 참조와 람다로 표현하기 위해 공통의 함수 디스크립터를 기술하는 Functional Interface를 알아보겠습니다.

메서드 참조

메서드 참조란 특정 메서드만을 호출하는 람다의 축약버전이다.

람다가 메서드를 특정 호출할 때, 어떻게 메서드를 호출해야하는지 설명을 참조하기보다 특정 메서드를 직접 전달할 수 있다는 장점이 있다.

또한 인수를 더 깔끔하게 전달할 수 있다.

하지만 실제 메서드를 호출하는 것이 아니므로 괄호는 필요없다.

메서드 참조를 만드는 방법

  1. 정적 메서드 참조
//람다
(args) -> ClassName.staticMethod(args)
//메서드 참조
ClassName::staticMethod
  1. 다양한 형식의 인스턴스 메서드 참조
//람다
(arg0, rest) -> arg0.instanceMethod(rest)
//메서드 참조
ClassName::instanceMethod
  1. 기존 객체의 인스턴스 메서드 참조
//람다
(args) -> expr.instanceMethod(args)
//메서드 참조
expr::instanceMethod

생성자 참조

new 키워드를 이용해서 기존 생성자의 참조를 만들 수 있다.

java.util.function 패키지에서 제공하는 여러가지 함수형 인터페이스

람다표현식을 사용하려면 공통의 함수 디스크립터를 기술하는 함수형 인터페이스가 필요하다.
java.util.function 패키지에서 제공하는 여러가지 함수형 인터페이스를 알아보고 사용하자.

Predicate

@FunctionalInterface
public interfacePredicate<T> {
	boolean test(T t);
}
  • predicate는 test라는 추상 메서드를 정의, test는 T type의 객체를 인수로 받아 boolean을 반환한다.
  • 복잡한 Predicate를 만들 수 있도록 negate, and , or 메서드를 제공한다.
Predicate<Apple> notRedApple = redApple.negate();//기존 !조건값을 적용
Predicate<Apple> redAndHeavyApple = redApple.and(apple -> apple.getWeight > 150);
Predicate<Apple> readAndHeavyOrGreen = redApple.and(apple -> apple.getWeight > 150)
																			.or(apple -> GREEN.equals(apple.getColor()));
//기존 조건에 조건 추가

Consumer

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}
  • consumer는 accept라는 추상 메서드를 정의, T type 객체를 받아 void를 반환한다.
  • 객체를 인수로 받아 어떤 동작을 수행하고 싶을 때, 사용한다.

Function

@FunctionalInterface
public interfaceFunction<T, R> {
	R apply(T t);
}
  • function은 apply라는 추상메서드를 정의, T type 객체를 받아 R type 객체를 반환한다.
  • andThen()
    apply의 결과값을 andThen안의 funtion에 넘긴다.
    ex) multiple.andThen(print).apply(10); // result: 100
  • compose()
    Function<Integer, Double> add = n -> n + 2.0;
            Function<Double, Double> multiply = n -> n * 5.0;
            Function<Integer, Double> addAndMultiply = multiply.compose(add);
    compose 내부의 funtion이 먼저 실행되어 반환값을 compose를 사용한 funtion의 argument로 넘긴다.
    ex) addAndMultiply.apply(1) // (1+2) * 5 ⇒ 15
profile
코딩하는 감자

0개의 댓글