39. 复合函数

作者: 厚土火焱 | 来源:发表于2017-11-29 22:13 被阅读34次

复合函数有什么用呢?可以简单解释为,一个函数的参数是另一个函数,直接用另一个函数完成这个复合的功能。
还是看个例子吧。先写两个函数

val add5 = {i:Int -> i + 5}
val multiplyBy2 = {i:Int -> i * 2}

一个实现了加法,一个实现了乘法。调用如下

    println(multiplyBy2(5))
    println(add5(3))

我们也可以这样

println(multiplyBy2(add5(3)))

把 add5 之后的结果,再进行 multiplyBy2 运算。
只是这样写,如果调用的地方多了似乎比较麻烦啊!这时候就可以写一个复合函数了。

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

infix 是中缀修饰符,方便调用的。
fun <P1,P2, R> 中P1,P2是参数,R是返回值。
Function1<P1,P2>中 P1是参数,P2是返回值。这里的Function1表示传入的参数是个Function。
andThen是Function1的扩展。
参数就是 Function1函数。
返回值也是Function1函数。
这个函数的调用是这样的

    val add5AndMultiplyBy2 = add5 andThen multiplyBy2
    println(add5AndMultiplyBy2(3))

调用的关键,就是那个扩展函数名。
这个名字(andThen)按照我们的喜好来定义就可以。
先运行一下看结果。

10
8
16
16

再写一个同样通能的,换个名字看看。

infix fun <P1,P2, R> Function1<P1, P2>.jiXuZuo(function: Function1<P2, R>):Function1<P1, R>{
    return fun(p1:P1):R{
        return function.invoke(this.invoke(p1))
    }
}

然后这样调用

    val addJiXuZuoMultiplyBy2 = add5 jiXuZuo multiplyBy2
    println(addJiXuZuoMultiplyBy2(3))

运行结果也是 16
只是,这种调用有点不走寻常路,是吗?这就是 infix 的妙用。如果你去掉它,就要像一般的函数那样调用了。
我们再写一个一样功能的函数,但是不加 infix

    val addJiXuZuoMultiplyBy2 = add5 jiXuZuo multiplyBy2
    println(addJiXuZuoMultiplyBy2(3))

它的调用就不同了,要这样写

    val addFuheMultiplyBy2 = add5.fuhe(multiplyBy2)
    println(addFuheMultiplyBy2(3))

这样是不是就很熟悉了?
也不仅仅是 Int,其他类型也是可以这样写复合函数的。下面用 String 再调用一下。

val myname = { str: String -> "my age is " + str }
val age = { i: String -> i }

在 main 里这样写

    println(age(myname("six")))
    val mynameAndAge = age jiXuZuo myname
    println(mynameAndAge("seven"))

运行的结果是

my age is six
my age is seven

在处理P1,P2的时候,千万别弄错顺序哦。不然结果就完全不同了。当然,String 类型好像没这种烦恼。

相关文章

  • 39. 复合函数

    复合函数有什么用呢?可以简单解释为,一个函数的参数是另一个函数,直接用另一个函数完成这个复合的功能。还是看个例子吧...

  • 复合函数

    复合函数的相关概念 复合函数的性质 复合函数的求导

  • Lambda表达式

    函数式接口 复合Lambda表达式 比较器复合 谓词复合 函数复合

  • 6-3_1 复合求导

    一、 多元函数复合求导 1 复合函数的中间变量为一元函数的情形 2 复合函数的中间变量为多元函数的情形 3 复合函...

  • 复合函数的单调性

    参考自:复合函数的概念及复合函数的单调性 - 豆丁网

  • 复合 Lambda 表达式的有用方法

    比较器复合 逆序 比较器链 谓词复合 函数复合 andThen方法会返回一个函数,它先对输入应用一个给定函数,再对...

  • 复合函数

    01、复合函数定义 设y=f(u),u=g(x)变量x与y之间通过变量u形成的一种函数关系,记为y=f(u)=f[...

  • 复合函数

    讲解对象:复合函数作者:融水公子 rsgz

  • 数据抽象

    数据抽象 复合简单数据形成复合数据,复合数据可以提高程序的模块化。数据抽象类似于函数抽象,函数抽象将函数的实现细节...

  • Hive函数

    Hive函数 内置函数 一、关系运算: 二、数学运算: 三、逻辑运算: 四、复合类型构造函数 五、复合类型操作符 ...

网友评论

    本文标题:39. 复合函数

    本文链接:https://www.haomeiwen.com/subject/mbjpbxtx.html