Kotlin學(xué)習(xí)筆記(五十二)函數(shù)復(fù)合

**
 * 函數(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é)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容