หากคุณต้องการ 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
แม้ว่าการแกงกะหรี่จะเป็นไปตามธรรมชาติสำหรับภาษาใด ๆ ที่รองรับการเขียนโปรแกรมเชิงฟังก์ชันนอกเหนือจาก lambdas แต่ Java ไม่ได้ถูกสร้างขึ้นด้วยวิธีนี้และแม้ว่าจะทำได้โค้ดก็ยากที่จะรักษาและบางครั้งก็อ่านได้ อย่างไรก็ตามมันมีประโยชน์มากในการออกกำลังกายและบางครั้งฟังก์ชันบางส่วนก็มีตำแหน่งที่ถูกต้องในโค้ดของคุณ