【31】kotlin 函数复合

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
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值