Kotlin高阶函数与函数式编程详解
函数可变参数:
在上一次https://www.cnblogs.com/webor2006/p/11518425.html中学到了可变参考,关于可变参数有如下规则说明:
“一个方法中,只允许一个参数为vararg,通常作为最后一个参数,如果vararg不是最后一个参数,那么其后的参数就需要通过具名参数形式进行传递;如果其后的参数是函数类型,那么还可以通过在圆括号外传递lambda表达式来实现。”
下面来看下代码:
下面再来看另一种方式:
中缀符号(infix notation):
函数还可以通过中缀符号形式来调用,需要满足如下3个条件:
1、是成员函数或扩展函数。
2、拥有单个参数。
3、声明时使用infix关键字。
下面用代码来进行说明:
接下来改用中缀调用法,如下:
日常开发中用得不多,但是得了解。
内联函数(inline fuction):
在C++中也有内联,下面看一下在Kotlin内联函数的用法:
调用跟用普通方法木有任何区别:
那。。内联和非内联函数有啥区别呢?下面来查看一下字节码文件来揭晓其答案,先将inline关键字去掉,反编译看一下它在字节码的表现:
下面来仔细读一下main()方法的助记符:
好,接下来将其改为内联函数,再次反编译看结果:
确实这俩本质区别还是比较大的。
高阶函数(high-order fuction)与Lambda:
啥是高阶函数其实在Java8中已经学习过了,简单说就是一个函数接收了另外一个函数作为参数或者是返回一个函数作为返回值,下面先对Lambda表达式格式要求进行总结一下:
1、一个Lambda表达式总是被一对花括号所包围。
2、其参数(如果有的话)位于 -> 之前(参数类型可以省略掉的)。
3、执行体位于 -> 之后。
在Kotlin中,如果一个函数的最后一个参数是个函数,那么可以将lambda表达式作为实参传递进去,并且可以在调用时方法圆括号外去使用。
下面定义几个Lambda表达式:
其实类型声明是可以省略掉的,如下:
接下来再来看一个:
呃,这个Lambda表达式有点奇怪,其实它的类型是这样的:
接下来再来定义一个特殊的:
还可以这样进行简化:
最后再来看一个,如果是整个函数都可能为空,而非只是返回值,就可以这样来定义: