jdk8부터 람다를 사용할 수 있습니다.

java.util.function 패키지에 여러 함수형 인터페이스들이 정의되어 있는데, 매개변수가 2개인 BiFunction, BiPredicate, BiConsumer 등 까지만 정의되어 있습니다.

 

@FunctionalInterface
interface TriFunction<T, U, V, R> {
    R apply(T t, U u, V v);
}

@FunctionalInterface
interface TriPredicate<T, U, V> {
    boolean test(T t, U u, V v);
}

@FunctionalInterface
interface TriConsumer<T, U, V> {
    void accept(T t, U u, V v);
}

매개변수가 3개 이상인 함수형 인터페이스는 직접 만들면 됩니다. @FunctionalInterface 어노테이션 붙이는 걸 잊지 마세요.

가장 기본적인 함수형 인터페이스의 리턴타입과 동작 방식은 아래와 같습니다 (R은 리턴 타입입니다)

  • Supplier<T>: T get()
    매개변수 없고 반환값만 있음
  • Consumer<T>: void accept(T t)
    매개변수 있고 반환값 없음
  • Function<T, R>: R apply(T t)
    매개변수, 반환값 있음
  • Predicate<T>: boolean test(T t)
    매개변수 있고 반환값은 boolean

 

Function<Double, Function<Integer, Consumer<String>>> f = d -> i -> s -> {
    System.out.println("" + d+ ";" + i+ ";" + s); 
};
f.apply(1.0).apply(2).accept("s");

커링(currying)으로도 가능하다...라곤 하지만 그냥 함수형 인터페이스 쓰는게 여러모로 나아 보입니다.