**
* 函数复合
* f(g(x))
* 可以使用拓展函数进行函数的复合,以进行函数调用的简化
*/
val add5 = { i: Int -> i + 5 } //g(x),lambda表达式,返回i+5
val multiplyBy2 = { i: Int -> i * 2 } //f(x),lambda表达式,返回i * 2
fun main(args: Array<String>) {
println(multiplyBy2(add5(8))) // ( 5 + 8 ) * 2
val add5AndMultiplyBy2 = add5 andThen multiplyBy2 //复合两个函数(复合函数后效果与multiplyBy2一致)
println(add5AndMultiplyBy2(8)) //执行调用函数 m(x)=f(g(x)) ( 5 + 8 ) * 2
val add5ComposeMultiplyBy2 = add5 compose multiplyBy2 //复合两个函数(复合函数后效果与add5AndMultiplyBy2相反)
println(add5ComposeMultiplyBy2(8)) //执行调用函数 m(x)=g(f(x)) ( 8 * 2 ) + 5
}
/**
* 此方法拓展了Function1(有一个参数的方法,第一个泛型为参数类型,第二个泛型为返回值类型),
* 并使用中缀表达式进行操作,用于结合两个函数,
* 下面的泛型参数,<P1,P2>为泛型的方法是在中缀表达式之前那个,而<P2,R>为泛型的方法是中缀表达式后面那个,
* p1代表的是传入<P2,,R>方法中的参数,也就是上面的8,this.invoke(p1)表示调用<P1,P2>方法,
* 之后将其值传给function,也就是<P2,R>为泛型的方法,调用该方法后返回其值,
* 总体来说就是调用完一个有一个参数的方法,再调用另一个有一个参数的方法
*/
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))
}
}
//该方法与andThen调用的顺序不一样
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))
}
}
Kotlin学习笔记(五十二)函数复合
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 高阶函数,又称算子(运算符)或泛函,包含多于一个箭头的函数,高阶函数是至少满足下列一个条件的函数:1.接受一个或多...