Nếu tôi tạo ra một giao diện chức năng:Làm thế nào để trực tiếp sử dụng một chức năng như một loại chức năng trong Java 8
@FunctionalInterface
public class Consumer2<T1, T2> {
void accept(T1 t1, T2 t2);
default Consumer1<T2> curry(T1 t1) {
return (t2) -> accept(t1, t2);
}
}
Bây giờ, nếu tôi có một lớp:
public class MyClass {
public void printStrings(String a, String b) {
System.out.println(a + ": " + b);
}
}
MyClass myClass = new MyClass();
Bây giờ, nếu tôi muốn sử dụng giao diện chức năng của tôi, tôi có thể:
Consumer2<String, String> printString = myClass::printStrings;
printString.curry("hello").accept("world");
Nhưng tôi không thể làm điều gì đó như:
myClass::printStrings.curry("hello").accept("world");
có ý nghĩa, bởi vì Java không có cách nào biết rằng myClass::printStrings
có thể được áp dụng cho giao diện chức năng Consumer2
. Để làm điều này, tôi đã tạo ra một lớp tiện ích:
public class F {
public static <T1, T2> Consumer2<T1, T2> c2(Consumer2<T1, T2> fn) {
return fn;
}
}
Sau đó, tôi có thể:
F.c2(myClass::printStrings).curry("hello").accept("world");
Thậm chí, điều này sẽ làm việc:
((Consumer2<String, String>)myClass::printStrings).curry("hello").accept("world");
Chừng nào có một số cách cho Java 8 để hiểu rằng loại chức năng trong trường hợp này. Vì vậy, câu hỏi là, cách tốt nhất để làm điều đó là gì, trong khi có thể tránh được bản mẫu?
Tôi đoán lớp 'Consumer2' được coi là 'giao diện Consumer2' ... – Holger