추상 메서드를 딱 하나만 갖고 있는 인터페이스를 말한다. Single Abstract Method 라고 불리기도 한다. 다음 코드를 보자.
@FunctionalInterface
public interface MyRunnable {
void doSomething();
static void printName() {
System.out.println("NAME");
}
default void printAge() {
System.out.println("Age");
}
}
자바는 다양한 함수형 인터페이스들을 제공한다. 다음 표가 그 예이다.
인터페이스 | 함수 시그니처 | 예 |
---|---|---|
UnaryOperator | T apply(T t) | String::toLowerCase |
BinaryOperator | T apply(T t1, T t2) | BigInteger::add |
Predicate | boolean test(T t) | Collection::isEmpty |
Function<T,R> | R apply(T t) | Arrays::asList |
Supplier | T get() | Instant::now |
Consumer | void accept(T t) | System.out::println |
표준 함수형 인터페이스의 대부분은 기본 타입만 지원한다. 그렇다고 기본 함수형 인터페이스에 박싱된 기본 타입을 넣어서 사용하지는 말자. 표준 함수형 인터페이스는 대부분의 상황을 제공한다.
@FunctionalInterface
를 사용하는 이유는 세 가지가 있다.
위와 같은 이점을 누리기 위해 직접 만든 함수형 인터페이스에는 항상 @FunctionalInterce
를 사용하도록 하자.
서로 다른 함수형 인터페이스를 같은 위치의 인수로 받는 메서드들을 다중 정의해서는 안된다. 클라이언트에게 불필요한 모호함만 줄 뿐, 이로 인해서 실제로 문제가 일어나기도 한다.