kotlin学习笔记之复合函数f(g(x))
Posted mictoy_朱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kotlin学习笔记之复合函数f(g(x))相关的知识,希望对你有一定的参考价值。
与高阶函数类似,复合函数的参数也是一个函数,不同的是,复合函数通过中缀表达式定义的函数,最终实现同参数及返回值的各种函数之间的复合运算。
举个例子,实现复合函数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来定义函数模式
以上是关于kotlin学习笔记之复合函数f(g(x))的主要内容,如果未能解决你的问题,请参考以下文章