code
package com.yzdzy.kotlin.chapter5.componse
//求f(g(x))
// 如果m(x)=f(g(x))
//那么 m就是fgx的复合
val add5 = { i: Int -> i + 5 }
val multiplyBy2 = { i: Int -> i * 2 }
//复合函数
infix fun <P1, P2, R> Function1<P1, P2>.andThen(function: Function1<P2, R>): Function1<P1, R> {
return fun(p1: P1): R {
return function.invoke(this.invoke(p1))
}
}
fun main(args: Array<String>) {
//(5+8)*2
val res = multiplyBy2(add5(8))
println(res)
//复合后
val and5AndMultiplyBy2 = add5 andThen multiplyBy2
println(and5AndMultiplyBy2(8))
}
哦 好tm的复杂
我们来简单解析一下
//拆解上面一下 /* p1 p2 代表参数 R代表返回值 p1 8 p2 add5的返回值 * andThen 是扩展方法。扩展的方法1 * infix 是中缀表达式,不用点也不用括号 * Function1 代表传入一个参数的函数 <P1, P2> p1代表参数类型 p2代表返回值类型 * andThen 后面的 Function1<P2, R> 代表 multiplyBy2 * * */
还有一种
compose写法
package com.yzdzy.kotlin.chapter5.componse
//求f(g(x))
// 如果m(x)=f(g(x))
//那么 m就是fgx的复合
val add5 = { i: Int -> i + 5 }
val multiplyBy2 = { i: Int -> i * 2 }
//复合函数
infix fun <P1, P2, R> Function1<P1, P2>.andThen(function: Function1<P2, R>): Function1<P1, R> {
return fun(p1: P1): R {
return function.invoke(this.invoke(p1))
}
}
//拆解上面一下
/*
p1 p2 代表参数
R代表返回值
p1 8
p2 add5的返回值
* andThen 是扩展方法。扩展的方法1
* infix 是中缀表达式,不用点也不用括号
* Function1 代表传入一个参数的函数 <P1, P2> p1代表参数类型 p2代表返回值类型
* andThen 后面的 Function1<P2, R> 代表 multiplyBy2
*
* */
infix fun <P1, P2, R> Function1<P2, R>.compose(function: Function1<P1,P2>):Function1<P1,R>{
return fun(p1:P1):R{
return this.invoke(function.invoke(p1))
}
}
fun main(args: Array<String>) {
//(5+8)*2
val res = multiplyBy2(add5(8))
println(res)
//复合后
val and5AndMultiplyBy2 = add5 andThen multiplyBy2
//m(x) = f(g(x))
println(and5AndMultiplyBy2(8))
val and5ComposeMultiplyBy2 = add5 compose multiplyBy2
//m(x) = g(f(x))
println(and5ComposeMultiplyBy2(8))
}
26
26
21