版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zsp765098084/article/details/91439054
与高阶函数类似,复合函数的参数也是一个函数,不同的是,复合函数通过中缀表达式定义的函数,最终实现同参数及返回值的各种函数之间的复合运算。
举个例子,实现复合函数m(x) = f(g(x))的运算函数
//首先自定义函数f(x)和g(x) //g(x) val add5 = {i:Int->i+5} //f(x) val multiplyBy2 = {i:Int -> i*2} //首先在学习复合函数之前,我们实现f(g(x))的运算会使用如下调用 fun main(){ val result = multiplyBy2(add5(8)) //传入参数值8 println(result) }
运行结果
26
下面使用kotlin中复合函数的功能实现该功能:
//解析 //infix 是中缀表达式,所以最终调用addThen的时候不需要用function.addThen的方式调用,这里addThen是自定义扩展函数 //关于这里的几个泛型参数P1、P2、R,以m(x) = f(g(x))为例 //P1为原始参数x,P2为g(x),R为最终返回值m(x) //关于Function1<P1,P2> 这里P1为参数,P2为函数返回值 infix fun<P1,P2,R> Function1<P2,R>.andThen(function: Function1<P1,P2>):Function1<P1,R>{ return fun(p1:P1):R{ return this.invoke(function.invoke(p1))//这里是关键,定义了最终的函数表达式,这里为f(g(x) } } //复合函数使用 fun main(){ //普通函数调用 val result = multiplyBy2(add5(8)) //传入参数值8 println(result) //复合函数定义 val fGx = multiplyBy2 andThen add5 //f(g(x) println(fGx(8)) //预测结果:(8+5)*2 = 26 }
运行结果
26
26
同理我们要实现m(x) = g(f(x)),因为f(x)与g(x)参数类型及返回值类型相同,我们同样可以使用andThen这个复合函数,此时我们只需调换他们的位置即可
fun main(){ val gFx = add5 andThen multiplyBy2 //g(f(x) println(gFx(8)) //预测结果:8*2+5 = 21 }
//运行结果
21
现在我们实现多参复合函数m(x,y) = f(g(x,y)
//f(x) val funFx = {i:Int -> i+2} //g(x,y) val funGxy = {i:Int,j:Int -> 3*i+100/j} //复合函数f(g(x,y)) //因为g()有两个参数,所以这里使用Function2 //同样的,P1,P2为对应的参数x,y,P3对应为g(x,y),R对应为f(g(x,y)) infix fun<P1,P2,P3,R> Function1<P3,R>.complexFun(function: Function2<P1,P2,P3>):Function2<P1,P2,R>{ return fun(p1,p2):R{ return this.invoke(function.invoke(p1, p2)) } } //调用 fun main() { val funFxComplexFunGxy = funFx complexFun funGxy println(funFxComplexFunGxy(3,5)) //预测运行结果:(3*3 + 100/5)+2 = 31 }
运行结果
31
总结
- 复合函数利用中缀表达式(infix)实现类似加减乘除的运算方式形式
- 只要函数它的参数及返回值类型符合我们定义的复合函数,都可以直接套用以实现复合调用
- 复合函数定义需借助FunctionN来定义函数模式
文章来源: https://blog.csdn.net/zsp765098084/article/details/91439054