**
* 函數(shù)復(fù)合
* f(g(x))
* 可以使用拓展函數(shù)進(jìn)行函數(shù)的復(fù)合,以進(jìn)行函數(shù)調(diào)用的簡化
*/
val add5 = { i: Int -> i + 5 } //g(x),lambda表達(dá)式,返回i+5
val multiplyBy2 = { i: Int -> i * 2 } //f(x),lambda表達(dá)式,返回i * 2
fun main(args: Array<String>) {
println(multiplyBy2(add5(8))) // ( 5 + 8 ) * 2
val add5AndMultiplyBy2 = add5 andThen multiplyBy2 //復(fù)合兩個(gè)函數(shù)(復(fù)合函數(shù)后效果與multiplyBy2一致)
println(add5AndMultiplyBy2(8)) //執(zhí)行調(diào)用函數(shù) m(x)=f(g(x)) ( 5 + 8 ) * 2
val add5ComposeMultiplyBy2 = add5 compose multiplyBy2 //復(fù)合兩個(gè)函數(shù)(復(fù)合函數(shù)后效果與add5AndMultiplyBy2相反)
println(add5ComposeMultiplyBy2(8)) //執(zhí)行調(diào)用函數(shù) m(x)=g(f(x)) ( 8 * 2 ) + 5
}
/**
* 此方法拓展了Function1(有一個(gè)參數(shù)的方法,第一個(gè)泛型為參數(shù)類型,第二個(gè)泛型為返回值類型),
* 并使用中綴表達(dá)式進(jìn)行操作,用于結(jié)合兩個(gè)函數(shù),
* 下面的泛型參數(shù),<P1,P2>為泛型的方法是在中綴表達(dá)式之前那個(gè),而<P2,R>為泛型的方法是中綴表達(dá)式后面那個(gè),
* p1代表的是傳入<P2,,R>方法中的參數(shù),也就是上面的8,this.invoke(p1)表示調(diào)用<P1,P2>方法,
* 之后將其值傳給function,也就是<P2,R>為泛型的方法,調(diào)用該方法后返回其值,
* 總體來說就是調(diào)用完一個(gè)有一個(gè)參數(shù)的方法,再調(diào)用另一個(gè)有一個(gè)參數(shù)的方法
*/
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調(diào)用的順序不一樣
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))
}
}

運(yùn)行結(jié)果