天天看点

Kotlin 函数复合

一、函数复合的概念

f(g(x))

二、看一些小例子

package net.println.kotlin.chapter5.compose

/**
 * @author:wangdong
 * @description:
 */

/**定义两个函数*/
val add5 = {i: Int -> i + 5} //加5
val multiplyBy2 = {i: Int -> i * 2}  //乘2

fun main(args: Array<String>) {
    println(multiplyBy2(add5(8)))  //(5 + 8) * 2

    val add5AndMultiplyBy2 = add5 andThen multiplyBy2
    val add5ComposeMutiplyBy2 = add5 compose multiplyBy2
    println(add5AndMultiplyBy2(8))  //m(x)= f(g(x))
    println(add5ComposeMutiplyBy2(8)) //m(x) = g(f(x))
}

/**定义一个复合函数*/
/**
 * p1、p2是参数
 * R是返回值
 * andThen拓展函数
 * 参数:Function1<P2,P2>,第一参数是参数类型,第二个参数是返回值类型
 * 返回值:Function1<P1,R>
 * infix中缀表达式
 */
infix fun <P1,P2,R> Function1<P1,P2>.andThen(function: Function1<P2,R>): Function1<P1,R>{
    //进行复合
    //返回了一个函数
    return fun (p1: P1):R{
        //函数里面function.invoke把这个function又调用了一遍
        //然后又把自己的返回值传给了上去
        return function.invoke(this.invoke(p1))
    }
}

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))
    }
}           

输出的结果

26 26 21