工作中遇到了该接口,查看源码写下自己的理解
jdk源码如下:
public interface Function<T, R> {
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
...
}
接口解读:
1.函数式接口,只存在一个抽象方法R apply(T t)
2.该接口两个类型变量T代表入参类型,R代表返回值类型,该接口主要用于对T类型参数进行处理,返回R类型的值
andThen方法
假设存在以下伪代码
public static void main(String[] args) {
T1 param=...;
Function<T1,R1> param1=(t)->{fx1(t)}
Function<T2,R2> param2=(t)->{fx2(t)}
param1.andThen(param2).apply(param)
}
①首先是param1.andThen(param2)
//andThen方法源码,此处类型参数V由编译器自动推导得出,返回类型同样是个Function接口类型的对象
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
看到apply(t),此处的隐式参数是param1,所以调用的是param1.apply(t),执行
fx1(t),传入T1类型参数,返回R1类型返回值
得到的返回值被作为参数传入after.apply(fx1(t)),而after对象即param2,所以调用为param2.apply(fx1(t)),执行
fx2(fx1(t)),传入R1类型参数,被T2类型参数接收(所以此处需要满足R1 extents T2或R1 implements T2),返回R2类型返回值
所以
return (T t) -> after.apply(apply(t));
返回的其实是函数式
fx2(fx1(t))
返回对象类型为Function接口类型,其中的apply方法被重写为
R2 apply(T1 t){
fx2(fx1(t))
}
//编译器会自动推导出返回值类型为R2,因此该Function接口为Function<T1,R2>,如开头所说,处理T1类型参数,返回R2类型返回值
②param1.andThen(param2).apply(param),执行如下
fx2(fx1(param))
最后可以得出param1.andThen(param2).apply(param)完成了以下事情
public static void main(String[] args) {
T1 param=...;
Function<T1,R1> param1=(t)->{fx1(t)}
Function<T2,R2> param2=(t)->{fx2(t)}
param1.andThen(param2).apply(param)
}
a)将param参数传入fx1(param),执行完里面的代码后,返回值(假设为middle)作为新参数传入fx2
b)执行函数fx2(middle)
compose方法——与andThen方法正好相反
a)将param参数传入fx2(param),执行完里面的代码后,返回值(假设为middle)作为新参数传入fx1
b)执行函数fx1(middle)
以上为对java.util.function包下public interface Function<T, R>的个人解读,希望能帮到别人,另外才疏学浅,如果有错误还请各位留言指出,以免我误导他人
如有转载还请标明出处