Intro::
이펙티브 자바 정리본입니다.
결론
•
입력값과 반환값에 함수형 인터페이스 타입을 활용합시다.
•
보통은 java.util.function 패키지의 표준 함수형 인터페이스를 사용하는 것이 가장 좋은 선택입니다.
•
단, 흔치는 않지만 직접 새로운 함수형 인터페이스를 만들어 쓰는 편이 나을 수 도 있음을 주의합시다.
◦
직접 만든 함수형 인터페이스에는 항상 @FunctionalInterface 애너테이션을 사용해야합니다.
java.util.function
해당 패키지에 다양한 용도의 표준 함수형 인터페이스가 있습니다. 필요한 용도에 맞는 게 있다면, 직접 구현하지 말고 표준 함수형 인터페이스를 활용하는 것이 좋습니다.
인터페이스 | 함수 시그니처 | 예 |
UnaryOperator<T> | T apply(T t) | String::toLowerCase |
BinaryOperator<T> | T apply(T t1, T t2) | BigInteger::add |
Predicate<T> | boolean test(T t) | Collection::isEmpty |
Function<T, R> | R apply(T t) | Arrays::asList |
Supplier<T> | T get() | Instant::now |
Consumer<T> | void accept(T t) | System.out::println |
질문
함수형 인터페이스는 추상 메서드를 오직 하나만 가지고 있어야한다고 하는데 실제 파일을 보면 왜 메서드 여러개??
package java.util.function;
import java.util.Objects;
public interface Function<T, R> {
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
Java
복사
말 그대로 추상메서드만 하나여야 한다는 말입니다. 위의 예시에서도 추상 메서드는 하나 뿐이며, 나머지는 디폴트 함수와 정적 제네릭 메서드이다.
References::
이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)