TriFunction이 필요한 경우 다음을 수행하십시오.
@FunctionalInterface
interface TriFunction<A,B,C,R> {
R apply(A a, B b, C c);
default <V> TriFunction<A, B, C, V> andThen(
Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (A a, B b, C c) -> after.apply(apply(a, b, c));
}
}
다음 작은 프로그램은 어떻게 사용되는지 보여줍니다. 결과 유형은 마지막 제네릭 유형 매개 변수로 지정됩니다.
public class Main {
public static void main(String[] args) {
BiFunction<Integer, Long, String> bi = (x,y) -> ""+x+","+y;
TriFunction<Boolean, Integer, Long, String> tri = (x,y,z) -> ""+x+","+y+","+z;
System.out.println(bi.apply(1, 2L)); //1,2
System.out.println(tri.apply(false, 1, 2L)); //false,1,2
tri = tri.andThen(s -> "["+s+"]");
System.out.println(tri.apply(true,2,3L)); //[true,2,3]
}
}
TriFunction에 대한 실용적인 사용이 있었 java.util.*
거나 java.lang.*
정의되었을 것입니다. 나는 22 개의 인수를 넘지 않을 것이다. ;-) 내가 의미하는 바는, 컬렉션을 스트리밍 할 수있는 모든 새로운 코드가 메소드 매개 변수로 TriFunction을 필요로하지 않는다는 것이다. 그래서 그것은 포함되지 않았습니다.
최신 정보
완전성을 위해 다른 답변 (커링 관련)의 파괴 함수 설명을 따르기 위해 추가 인터페이스없이 TriFunction을 에뮬레이션하는 방법은 다음과 같습니다.
Function<Integer, Function<Integer, UnaryOperator<Integer>>> tri1 = a -> b -> c -> a + b + c;
System.out.println(tri1.apply(1).apply(2).apply(3)); //prints 6
물론 다른 방법으로 함수를 결합하는 것도 가능합니다. 예 :
BiFunction<Integer, Integer, UnaryOperator<Integer>> tri2 = (a, b) -> c -> a + b + c;
System.out.println(tri2.apply(1, 2).apply(3)); //prints 6
//partial function can be, of course, extracted this way
UnaryOperator partial = tri2.apply(1,2); //this is partial, eq to c -> 1 + 2 + c;
System.out.println(partial.apply(4)); //prints 7
System.out.println(partial.apply(5)); //prints 8
커링은 람다 이상의 기능적 프로그래밍을 지원하는 모든 언어에 자연 스럽지만 Java는 이러한 방식으로 빌드되지 않으며 달성 가능하지만 코드를 유지 관리하기 어렵고 때로는 읽기가 어렵습니다. 그러나 연습으로 매우 유용하며 때로는 부분 함수가 코드에서 적절한 위치에 있습니다.