【发布时间】:2014-12-19 04:57:32
【问题描述】:
这和这个问题有关:How to do function composition?
我注意到可以将方法引用分配给声明为Function 的变量,因此我假设它应该具有andThen 或compose 函数,因此我希望我们可以直接组合它们。但显然我们需要先将它们分配给声明为 Function 的变量(或在调用之前进行类型转换),然后才能对它们调用 andThen 或 compose。
我怀疑我可能对这应该如何工作有一些误解。
所以我的问题:
- 为什么在调用
andThen方法之前需要先进行类型转换或将其分配给变量? - 究竟是什么类型的方法引用需要以这种方式完成?
下面的示例代码。
public class MyMethods{
public static Integer triple(Integer a){return 3*a;}
public static Integer quadruple(Integer a){return 4*a;}
public int operate(int num, Function<Integer, Integer> f){
return f.apply(num);
}
public static void main(String[] args){
MyMethods methods = new MyMethods();
int three = methods.operate(1, MyMethods::triple); // This is fine
// Error below
// int twelve = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple));
// But this one is fine
Function<Integer, Integer> triple = MyMethods::triple;
Function<Integer, Integer> quadruple = MyMethods::quadruple;
int twelve = methods.operate(1, triple.andThen(quadruple));
// This one is also fine
int twelve2 = methods.operate(1, ((Function<Integer, Integer>)MyMethods::triple).andThen(MyMethods::quadruple));
}
}
更多错误说明
在 Eclipse 中,它以错误消息突出显示:
此表达式的目标类型必须是函数式接口
在 Java 8 编译器中,错误是:
java8test.java:14:错误:此处不需要方法引用 int 十二 = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple)); ^ 1 个错误(实际上,为什么 Eclipse 中的错误与 Java 8 编译器中的错误不同?)
【问题讨论】:
标签: java eclipse java-8 function-composition method-reference