- EX) 상위 클래스의 기본 메소드를 재정의해 원하는 동작을 구현하는 템플릿 메소드 패턴의 매력이 줄었다.
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > 100;
}
- 인스턴스가 생성되고 사용되는 메소드라서 가능하다.
@FunctionInterface interface EldestEntryRemovalFunction<K, V> {
boolean remove(Map<K,V> map, Map.Entry<K, V> eldest);
}
- 위 예에서는 표준 인터페이스인 java.util.function의 BiPredicate<Map<K, V>, Map.Entry<K, V» 를 사용할 수 있다.
인터페이스 | 함수 시그니처 | 설명 | EX |
---|---|---|---|
UnaryOperator |
T apply(T t) | 반환값과 인수의 타입이 같은 함수, 인수는 1개 | String::toLowerCase |
BinaryOperator |
T apply(T t1, T t2) | 반환값과 인수의 타입이 같은 함수, 인수는 2개 | BigInteger::add |
Predicate |
boolean test(T t) | 한 개의 인수를 받아서 boolean을 반환하는 함수 | Collection::isEmpty |
Function<T,R> | R apply(T t) | 인수와 반환 타입이 다른 함수 | Arrays::asList |
Supplier |
T get() | 인수를 받지 않고 값을 반환하는 함수 | Instant::now |
Consumer |
void accept(T t) | 인수를 하나 받고 반환값이 없는 함수System.out::println |
- 성능 이슈가 생길 수 있다.
@FunctionInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
@FunctionalInterface
public interface ToIntBiFunction<T, U> {
int applyAsInt(T t, U u);
}
- API 에서 굉장히 많이 사용되는데 지금의 이름이 그 용도를 아주 잘 설명해준다.
- 구현하는 쪽에서 반드시 지켜야 할 규약을 담고 있다.
- 비교자들을 변환하고 조합해주는 유용한 디폴트 메소드들을 많이 가지고 있다.
- 이는 클라이언트에게 불필요한 모호함을 남긴다.
public interface ExecutorService extends Executor {
<T> Future<T> submit(Callback<T> task);
Future<?> submit(Runnable task);
}
Reference: