工作中遇到了该接口,查看源码写下自己的理解
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)
总结
后续还会遇到类似的函数式接口,他们都是大同小异的,主要是为了接收方法体,该方法体会在之后的程序中执行一次或反复执行多次(有兴趣可以去了解一下java8引入的lambda表达式)
函数式接口 | 参数类型 | 返回类型 | 抽象方法名 | 描述 | 其他方法 |
---|---|---|---|---|---|
Runnable | 无 | void | run | 作为无参数或返回值的动作执行 | |
Supplier<T> | 无 | T | get | 返回T类型的值 | |
Consumer<T> | T | void | accept | 处理T类型的值 | andThen |
BiConsumer<T,U> | T,U | void | accept | 处理T和U类型的值 | andThen |
Function<T,R> | T | R | apply | 处理T类型的值,返回R类型的值 | compose,andThen,identity |
BiFunction<T,U,R> | T,U | R | apply | 处理T和U类型的值,返回R类型的值 | andThen |
UnaryOperator | T | T | apply | 处理T类型的值,返回T类型的值 | compose,andThen,identity |
BinaryOperator | T,T | T | apply | 处理两个T类型的值,返回T类型的值 | andThen,maxBy,minBy |
Predicate<T> | T | boolean | test | 布尔值函数 | and,or,negate,isEqual |
BiPredicate<T,U> | T,U | boolean | test | 两个入参的布尔值函数 | and,or,negate |