java.util.function 패키지에는 다양한 용도의 표준 함수형 인터페이스가 담겨 있다.
기억해야 할 함수형 인터페이스 6개
- Operator 인터페이스 - 반환값과 인수의 타입이 같은 함수
- 인수가 1개인 UnaryOperator
- 인수가 2개인 BinaryOperator
T apply(T t)
String::toLoswerCase
T apply(T t1, T t2)
BigInteger::add
- Predicate 인터페이스 - 인수 하나를 받아 boolean을 반환하는 함수
boolean test(T t)
Collection::isEmpty
- Function 인터페이스 - 인수와 반환 타입이 다른 함수
R apply(T t)
Arrays::asList
- Supplier 인터페이스 - 인수를 받지 않고 값을 반환하는 함수
T get()
Instant::now
- Consumer 인터페이스 - 인수를 하나 받고 반환값은 없는(인수를 소비하는) 함수
void accept(T t)
System.out::println
전용 함수형 인터페이스 구현하기
기본적으로 표준 함수형 인터페이스를 사용하는 것이 좋지만, 다음과 같은 조건에서는 전용 함수형 인터페이스를 만드는 것이 좋다. (e.g Comparator)
- 자주 쓰이며, 이름 자체가 용도를 명확히 설명해준다.
- 반드시 따라야 하는 규약이 있다.
- 유용한 디폴트 메서드를 제공할 수 있다.
함수형 인터페이스를 작성할 때는 꼭 @Functional Interface 애너테이션을 다는 것이 좋다. 이유는 다음과 같다.
- 해당 클래스의 코드나 설명 문서를 읽을 이에게 그 인터페이스가 람다용으로 설계된 것임을 알려준다.
- 해당 인터페이스가 추상 메서드를 오직 하나만 가지고 있어야 컴파일되게 해준다.
- 그 결과 유지보수 과정에서 누군가 실수로 메서드를 추가하지 못하게 막아준다.