在最简单的Java框架中,简化了框架概念:
★框架/framework是需要上层模块提供代码的低层骨架式方案。
换言之,我们说的框架,不要求它如applet或GUI框架那样,有太多底层细节或控制逻辑需要处理。因此,最简单的框架MyFramework的函数方法(functionalmethod)为
double op(double m,double n) ,对两个double操作后返回一个double值。
那么,更一般化,函数方法可以设计为double op(M m,N n) ,或者
package principle.callback.lower; @FunctionalInterface public interface DoubleOP<T,U>{ double applyAsDouble(T t, U u); }为什么取这样的函数名applyAsDouble呢?因为我喜欢。非也,我不喜欢。而是因为JDK中有这样的东西,它的方法名就是applyAsDouble。
java.util.function.*
该包中,有一系列的函数接口,为了通用使用了泛型,但是,Java中你又不能够定义不同个数参数的泛型类,如DoubleOP<T,U>、DoubleOP<T,U,V>/DoubleOP<T,U,V,W>,必须为它们取不同的名字,函数也取了一些不同的名字,真是醉了。
public static void testFunction(){ principle.callback.lower.DoubleOP<Double,String> f = ( x, y)->{return x +y.length() ;}; double d = f.applyAsDouble(1.0,"yqj2065"); pln(d); ToDoubleBiFunction<Double,Double> f1 = ( m, n)->{return m +2*n ;}; d = f1.applyAsDouble(1.0,3.0); pln(d); Function<String,Double> f2 = x->(double)x.length(); d = f2.apply("yqj2065"); pln(d); BiFunction<String,String,Double> f3 = (x,y)->x.length()+y.length()*1.0; d = f3.apply("yqj","2065"); pln(d); BinaryOperator<Double> f4 = (x,y)->x+y; d = f4.apply(1.0,3.0); pln(d); DoubleBinaryOperator f5 = (x,y)->x+y; d = f5.applyAsDouble(1.0,3.0); pln(d); }
都是类型擦除惹的祸。单就double op(double m,double n) 而言,最匹配的函数接口是DoubleBinaryOperator。
R foo(...) 形式,参数个数,支持到2个,基本类型支持int、double和long;有更多的要求,自己写,如char。