如果我创建一个功能接口:
@FunctionalInterface
public class Consumer2<T1, T2> {
void accept(T1 t1, T2 t2);
default Consumer1<T2> curry(T1 t1) {
return (t2) -> accept(t1, t2);
}
}
现在,如果我有一堂课:
public class MyClass {
public void printStrings(String a, String b) {
System.out.println(a + ": " + b);
}
}
MyClass myClass = new MyClass();
现在,如果我想使用我的功能界面,我可以:
Consumer2<String, String> printString = myClass::printStrings;
printString.curry("hello").accept("world");
但我不能做这样的事情:
myClass::printStrings.curry("hello").accept("world");
这是有道理的,因为 Java 无法知道myClass::printStrings
可以应用于函数式接口Consumer2
。为此,我创建了一个实用程序类:
public class F {
public static <T1, T2> Consumer2<T1, T2> c2(Consumer2<T1, T2> fn) {
return fn;
}
}
然后我可以:
F.c2(myClass::printStrings).curry("hello").accept("world");
甚至,这将起作用:
((Consumer2<String, String>)myClass::printStrings).curry("hello").accept("world");
在这种情况下,只要 Java 8 有某种方法可以理解该函数类型。所以,问题是,最好的方法是什么,同时又可能避免使用样板文件?