이번 포스팅에선 람다식을 더 가독성 있게 표현할 수 있는 메서드 참조와 람다로 표현하기 위해 공통의 함수 디스크립터를 기술하는 Functional Interface를 알아보겠습니다.
메서드 참조란 특정 메서드만을 호출하는 람다의 축약버전이다.
람다가 메서드를 특정 호출할 때, 어떻게 메서드를 호출해야하는지 설명을 참조하기보다 특정 메서드를 직접 전달할 수 있다는 장점이 있다.
또한 인수를 더 깔끔하게 전달할 수 있다.
하지만 실제 메서드를 호출하는 것이 아니므로 괄호는 필요없다.
//람다
(args) -> ClassName.staticMethod(args)
//메서드 참조
ClassName::staticMethod
//람다
(arg0, rest) -> arg0.instanceMethod(rest)
//메서드 참조
ClassName::instanceMethod
//람다
(args) -> expr.instanceMethod(args)
//메서드 참조
expr::instanceMethod
new 키워드를 이용해서 기존 생성자의 참조를 만들 수 있다.
람다표현식을 사용하려면 공통의 함수 디스크립터를 기술하는 함수형 인터페이스가 필요하다.
java.util.function 패키지에서 제공하는 여러가지 함수형 인터페이스를 알아보고 사용하자.
@FunctionalInterface
public interfacePredicate<T> {
boolean test(T t);
}
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()));
//기존 조건에 조건 추가
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
@FunctionalInterface
public interfaceFunction<T, R> {
R apply(T t);
}
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로 넘긴다.