Function接口
在以往所有实例中,想要使用lambda表达式都需要先创建或调用已有的函数式接口,但Java.util.function包已经提供了很多预定义的函数式接口,就是没实现任何功能,仅用来封装lambda表达式的对象。该包中最常用的接口是Function<T,R>,这个接口有以下两个泛型。
T | 被操作的类型,可以理解为方法参数的类型 |
R | 操作结果类型,可以理解为方法的返F |
使用Function写简单的函数
单一函数声明
以下为使用Function接口及lambda表达式写出函数f(x)=x*2
Function<Integer,Integer>function=f->f*2;
System.out.println(function.apply(2));
复合函数的声明
以下为使用Function接口及lambda写出函数f(x)=a*b
Function<Integer,Function<Integer,Integer>>function=x->(y->(x*y));
System.out.println(function.apply(2).apply(2));
柯里化
简单说, 柯里化(Currying)是一种处理多元函数的方法。 它产生一系列连锁函数,其中每个函数固定部分参数,并返回一个新函数,用于传回其它剩余参数的功能 。
static Function<Integer,Function<Integer,Function<Integer,Integer>>>mycurrying=new Function<Integer, Function<Integer, Function<Integer, Integer>>>() {
@Override
public Function<Integer, Function<Integer, Integer>> apply(Integer x) {
return new Function<Integer, Function<Integer, Integer>>() {
@Override
public Function<Integer, Integer> apply(Integer y) {
return new Function<Integer, Integer>() {
@Override
public Integer apply(Integer z) {
return x+y+z;
}
};
}
};
}
};
//感觉有点像递归
这种表达显得十分复杂,可以使用lambda表达式进行简化
如上述函数的操作。
//水完了^^