scala中的compose和andThen函数剖析
来源:互联网 发布:时时彩数据分析大师 编辑:程序博客网 时间:2024/06/05 15:09
源码
/** Composes two instances of Function1 in a new Function1, with this function applied last. * * @tparam A the type to which function `g` can be applied * @param g a function A => T1 * @return a new function `f` such that `f(x) == apply(g(x))` */ @annotation.unspecialized def compose[A](g: A => T1): A => R = { x => apply(g(x)) } /** Composes two instances of Function1 in a new Function1, with this function applied first. * * @tparam A the result type of function `g` * @param g a function R => A * @return a new function `f` such that `f(x) == g(apply(x))` */ @annotation.unspecialized def andThen[A](g: R => A): T1 => A = { x => g(apply(x)) }
源码中compose是说实现一个新的函数f(x) == apply(g(x))的函数,本质就是
构造一个新的函数为先运行f再运行g
而andThen则是实现新的函数f(x) ==g(apply(x)),二这个本质就是先运行g再运行f
/** * 传入Int,结果翻倍 */val doubleNum :Int => Int = {num => val numDouble = num * 2 println(s"double Num ($num * 2 = $numDouble)") numDouble}/** *传入Int,结果加一 */val addOne:Int => Int = {num=> val sumNum = num + 1 println(s"add One ($num + 1 = $sumNum)") sumNum}
/** * * @param g * @param f * @tparam A * @tparam B * @tparam C * @return */def myAndThen[A, B, C](g: A => B, f: B => C): A => C = x => f(g(x))/** * * @param g * @param f * @tparam A * @tparam B * @tparam C * @return */def myCompose[A, B, C](g: A => B, f: C => A): C => B = x => g(f(x))
compose:
期待一个C类型转化为B类型,也就是是说compose则是将先执行靠里面的函数,再将结果传给外层函数,所以先执行f将C类型的x转化为一个A类型,再作为参数传给g,得到一个B类型。
andThen:
期待一个A类型转化成一个C类型,x是一个A类型,将x传给g,作为g的参数得到一个一个B类型,再将结果作为参数传给f,f在是将B类型转化为一个C类型,最终实现A类型的x转化为C类型。
测试用例:
val myComposeTest = myCompose[Int, Int, Int](addOne, doubleNum)myComposeTest(2)val composeDoubleNumInAddOne = addOne compose doubleNumval composeAddOneInDoubleNum = doubleNum compose addOnecomposeDoubleNumInAddOne(2)composeAddOneInDoubleNum(2)assert(myComposeTest(2)==composeDoubleNumInAddOne(2))val myAndThenTest = myAndThen[Int,Int,Int](addOne,doubleNum)myAndThenTest(2)val addOneAndThenDoubleNum = addOne andThen doubleNumval doubleNumAndThenAddOne = doubleNum andThen addOneaddOneAndThenDoubleNum(2)doubleNumAndThenAddOne(2)assert(myAndThenTest(2)==addOneAndThenDoubleNum(2))
效果
0 0
- scala中的compose和andThen函数剖析
- Java 8:使用compose和andThen组合函数
- Java8的Function接口学习(compose和andThen)
- scala中的函数和方法
- Scala中的方法和函数
- Scala中的方法和函数
- Scala Functions vs Methods(scala中的函数和方法)
- Scala Functions vs Methods(scala中的函数和方法)
- java.util.function apply compose andThen 解析与应用(1)
- scala中的部分应用函数和偏函数的区别
- scala中的部分应用函数和偏函数的区别
- Scala中的本地函数
- scala中的函数
- Scala中的函数
- scala中的s函数
- scala中的函数
- 3.Scala中的函数
- scala中的偏函数
- jlink_v8原理图
- OFDM的个人笔记
- ABOUT THE TECHNOLOGY RADAR(关于技术雷达)
- 小马哥-----高仿苹果6P 主板型号Q33 HD 32A刷机拆机主板图与开机识别图 Q系列版本较多 警惕
- 集成友盟社会化分享
- scala中的compose和andThen函数剖析
- 工业4.0时代:世界不再是你过去所知道的那样
- 杭电2544-Dijkstra算法
- C程序的基本结构
- 戴旭:未来十年可能惨不忍睹,中国尚未意识到危机的逼近
- hibernate基于外键的双向1-1关系映射
- 南大软院大神养成计划第十二天
- win7下配置免安装版的MySQL 5.7.9
- CSS中id与class的区别理解