【发布时间】:2015-12-12 15:37:39
【问题描述】:
如果我创建一个函数式接口:
@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 有某种方法可以理解该函数类型。那么,问题是,最好的方法是什么,同时又可以避免使用样板文件?
【问题讨论】:
-
我猜
class Consumer2应该是interface Consumer2...
标签: java functional-programming java-8 method-reference