Search
🙈

이펙티브 자바:: 아이템 44 <표준 함수형 인터페이스를 사용하라>

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::

이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)