표준 함수형 인터페이스
•
아래와 같이 매개변수를 받아 문자열의 길이를 비교하는 메서드가 아래처럼 있다.
boolean checkLength(String s1, String s2) {
return s1.length() > s2.length();
}
Java
복사
•
이런 메서드는 람다를 활용하기 위해 함수형 인터페이스로 표현할 수 있다.
@FunctionalInterface
interface ICheckLength {
boolean checkLength(String s1, String s2);
}
ICheckLength result = (s1, s2) -> s1.length() > s2.length();
Java
복사
•
하지만 사실 이런 인터페이스는 자바 표준 라이브러리에 이미 준비되어있기 때문에, 직접 구현할 필요가 없다.
BinaryPredicate<String> result = (s1, s2) -> s1.length() > s2.length();
Java
복사
•
이렇게 자바 표준 라이버리에 이미 준비되어 있는 함수형 인터페이스들을 표준 함수형 인터페이스 혹은 표준 함수형 인터페이스 API라고 부른다.
기본 함수형 인터페이스
인터페이스 | 함수 시그니처 | 예 |
UnaryOpeator<T> | T apply(T t) | String::toLowerCase |
BinaryOpeator<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 |
•
위의 예시들에 더해 기본 함수형 인터페이스의 전체 개수는 43개이다. 다 외우기에 수가 많고 규칙성이 부족하기 때문에, 필요할 때 찾아서 사용하자.
•
또한 사용할 때 Long이나 Integer와 같은 박싱된 기본 타입을 사용하는 것은 계산량이 많을 때 성능이 굉장히 느려지므로 추천되지 않는다.
전용 함수 인터페이스의 구현을 고려하기
•
Comparator<T>의 경우에는 ToIntBiFunction<T, U>가 있지만 별도의 인터페이스로 존재한다. 그 이유는 Comparator API는 굉장히 자주 사용되고, 그 이름에서 용도와 목적을 명확히 설명 해준다. 또한 구현하는 쪽에서 지켜야 하는 규약을 포함하고 있으며, 비교자들을 활용할 수 있는 여러 유용한 디폴트 메서드를 제공하기 때문이다.
•
이처럼 아래의 3 가지 조건 중 하나 이상을 만족한다면 별도의 전용 함수 인터페이스를 구현하는 것을 고려해보는 것이 좋다.
◦
자주 사용되며, 이름 자체로 용도를 명확히 설명할 수 있다.
◦
해당 함수형 인터페이스를 사용할 때, 반드시 지켜져야하는 규약이 있다.
◦
유용한 디폴트 메서드를 제공할 수 있다.
•
이렇게 별도의 함수형 인터페이스를 구현하기를 선택했다면, @FunctionalInterface 애노테이션을 사용하자.
◦
해당 클래스의 코드나 설명이 필요한 사람에게 해당 인터페이스가 람다를 위한 함수형 인터페이스임을 명확히 할 수 있다.
◦
또한 컴파일 타임에 확인하여 해당 인터페이스가 추상 메서드를 오직 한 개만 가지고 있도록 보장해준다.