Kotlin高阶函数与函数式编程详解

函数可变参数:

在上一次https://www.cnblogs.com/webor2006/p/11518425.html中学到了可变参考,关于可变参数有如下规则说明:

“一个方法中,只允许一个参数为vararg,通常作为最后一个参数,如果vararg不是最后一个参数,那么其后的参数就需要通过具名参数形式进行传递;如果其后的参数是函数类型,那么还可以通过在圆括号外传递lambda表达式来实现。”

下面来看下代码:

Kotlin高阶函数与函数式编程详解_第1张图片

下面再来看另一种方式:

Kotlin高阶函数与函数式编程详解_第2张图片

中缀符号(infix notation):

函数还可以通过中缀符号形式来调用,需要满足如下3个条件:

1、是成员函数或扩展函数。

2、拥有单个参数。

3、声明时使用infix关键字。

下面用代码来进行说明:

Kotlin高阶函数与函数式编程详解_第3张图片

接下来改用中缀调用法,如下:

Kotlin高阶函数与函数式编程详解_第4张图片

日常开发中用得不多,但是得了解。

内联函数(inline fuction):

在C++中也有内联,下面看一下在Kotlin内联函数的用法:

调用跟用普通方法木有任何区别:

Kotlin高阶函数与函数式编程详解_第5张图片

那。。内联和非内联函数有啥区别呢?下面来查看一下字节码文件来揭晓其答案,先将inline关键字去掉,反编译看一下它在字节码的表现:

Kotlin高阶函数与函数式编程详解_第6张图片

下面来仔细读一下main()方法的助记符:

Kotlin高阶函数与函数式编程详解_第7张图片

Kotlin高阶函数与函数式编程详解_第8张图片

好,接下来将其改为内联函数,再次反编译看结果:

Kotlin高阶函数与函数式编程详解_第9张图片

Kotlin高阶函数与函数式编程详解_第10张图片

确实这俩本质区别还是比较大的。

高阶函数(high-order fuction)与Lambda:

啥是高阶函数其实在Java8中已经学习过了,简单说就是一个函数接收了另外一个函数作为参数或者是返回一个函数作为返回值,下面先对Lambda表达式格式要求进行总结一下:

1、一个Lambda表达式总是被一对花括号所包围。

2、其参数(如果有的话)位于 -> 之前(参数类型可以省略掉的)。

3、执行体位于 -> 之后。

在Kotlin中,如果一个函数的最后一个参数是个函数,那么可以将lambda表达式作为实参传递进去,并且可以在调用时方法圆括号外去使用。

下面定义几个Lambda表达式:

Kotlin高阶函数与函数式编程详解_第11张图片

其实类型声明是可以省略掉的,如下:

Kotlin高阶函数与函数式编程详解_第12张图片

接下来再来看一个:

Kotlin高阶函数与函数式编程详解_第13张图片

呃,这个Lambda表达式有点奇怪,其实它的类型是这样的:

Kotlin高阶函数与函数式编程详解_第14张图片

接下来再来定义一个特殊的:

Kotlin高阶函数与函数式编程详解_第15张图片

还可以这样进行简化:

Kotlin高阶函数与函数式编程详解_第16张图片

最后再来看一个,如果是整个函数都可能为空,而非只是返回值,就可以这样来定义:

Kotlin高阶函数与函数式编程详解_第17张图片

你可能感兴趣的:(从java到Kotlin,java,lambda,python,编程语言,机器学习)