Java8——接口Function

工作中遇到了该接口,查看源码写下自己的理解
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>的个人解读,希望能帮到别人,另外才疏学浅,如果有错误还请各位留言指出,以免我误导他人

如有转载还请标明出处

猜你喜欢

转载自blog.csdn.net/weixin_42152023/article/details/83060911
今日推荐