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)

总结

后续还会遇到类似的函数式接口,他们都是大同小异的,主要是为了接收方法体,该方法体会在之后的程序中执行一次或反复执行多次(有兴趣可以去了解一下java8引入的lambda表达式)

函数式接口参数类型返回类型抽象方法名描述其他方法
Runnablevoidrun作为无参数或返回值的动作执行
Supplier<T>Tget返回T类型的值
Consumer<T>Tvoidaccept处理T类型的值andThen
BiConsumer<T,U>T,Uvoidaccept处理T和U类型的值andThen
Function<T,R>TRapply处理T类型的值,返回R类型的值compose,andThen,identity
BiFunction<T,U,R>T,URapply处理T和U类型的值,返回R类型的值andThen
UnaryOperatorTTapply处理T类型的值,返回T类型的值compose,andThen,identity
BinaryOperatorT,TTapply处理两个T类型的值,返回T类型的值andThen,maxBy,minBy
Predicate<T>Tbooleantest布尔值函数and,or,negate,isEqual
BiPredicate<T,U>T,Ubooleantest两个入参的布尔值函数and,or,negate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值