-
함수형 인터페이스란?
- 1개의 추상 메소드만 가지는 인터페이스 (SAM)
- 자바에서 람다식은 함수형 인터페이스를 통해서만 사용가능!
// 함수형 인터페이스 예시 public interface FunctionalInterface { public abstract void run(String input); } FunctionalInterface funcInt = input -> System.out.println(input); // 재정의 funcInt.run("This is functional interface"); // 호출
-
표준 함수형 인터페이스
- java.util.function 패키지에 43개의 표준 함수형 인터페이스가 정의되어 있다.
- 기본 인터페이스
| 기본 인터페이스 | 추상 메소드 | 예시 | | --- |---------------------| --- | | 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 |
- 기본 인터페이스에서 입력 타입 또는 반환 타입을 특정하거나, 입력 인수의 개수를 바꾼 변형이 존재하여, 총 43개의 표준 함수형 인터페이스가 존재한다.
- ex) Predicate → IntPredicate, BinaryOperator → LongBinaryOperator, Function<T,R> → Function<T,U,R>
-
표준 함수형 인터페이스의 장점
- 직접 구현할 필요가 없어서 편하고, 코드의 구조가 간단해진다.
- 기본 추상 메소드 외에도 유용한 디폴트 메소드들이 많이 정의되어 있다.
- 직접 작성할 때의 위험성을 없앨 수 있다. (ex. 추상 메소드가 두개라던지...)
-
굳이 새로운 함수형 인터페이스를 구현해서 써야 하는 경우
- 사용 빈도가 높고, 이름이 직관적인 경우.
- 필수적으로 요구되는 규약이 있는 경우.
- 별도의 디폴트 메소드가 정의되어 있는 경우. (라이브러리에 포함된 경우)
- ex) Comparator : 표준 함수형 인터페이스인 ToIntBiFunction<T,U>와 동일한 구조임에도 별도로 정의된 라이브러리가 존재한다.
// Comparator 인터페이스 @FunctionalInterface public interface Comparator<T> { public abstract int compare(T o1, T o2); // 이외에 17개의 다른 메소드가 정의되어 있다. } // 사용 Comparator comparator = (o1, o2) -> o2-o1; int result = comparator.compare(a, b);
-
정리
- 람다식을 쓰려면 함수형 인터페이스를 써야 한다.
- java.util.function 패키지에 43개 타입의 표준 함수형 인터페이스가 정의되어 있다. 가급적이면 표준 함수형 인터페이스를 사용하라. 쉽고 유용하다.
- 직접 새로운 함수형 인터페이스를 정의해서 사용해야 할 수도 있는데, 이 때는 반드시
@FunctionalInterface
애너테이션을 붙여라.
-
참조