当前位置: 代码迷 >> 综合 >> Kotlin-5-高阶函数+Unit+Inline
  详细解决方案

Kotlin-5-高阶函数+Unit+Inline

热度:102   发布时间:2023-10-09 05:35:35.0

目录

1、定义:

2、Unit的定义

3、高阶函数的实现:

4、inline定义

5、inline 原理

6、如何在AndroidStudio中查看kotlin编译后的class源码


1、定义:

高阶函数是指: 函数(Lambda)的参数是函数(Lambda)

2、Unit的定义

/**
 * Unit的定义:在kotlin中当一个函数没有返回值的时候,默认返回一个Unit类型。
 *                      我们大部分情况是可以省略这个Unit的,但是当参数是一个没有
 *                      返回值的Lambda匿名函数的话,就需要声明出来
 */

3、高阶函数的实现:

下面的gaoFun()函数的参数除了一个布尔类型的isSay以外,还有一个lambda函数作为了参数。这种函数我们就称之为高阶函数。

fun gaoFun(isSay: Boolean, lambda: () -> Unit) {if (isSay) {println("高阶函数的参数lambda()匿名函数传了进来")lambda()}
}//main()函数的Unit就是省略的。(这里我特意加上了)
fun main(): Unit {//这里我们将lambda匿名函数传给了gaoFungaoFun(false, { println("我是高阶函数") })//因为gaoFun函数的最后一个参数是Lambda,所以我们可以将lambda匿名函数放在小括号的后面gaoFun(true) { println("我也可以放在这里") }/*** 这里我声明了一个Runnable匿名内部类,然后将匿名内部类的run匿名函数赋值给了lambda*/val runnable = Runnable {println("我是一个Runnable,我在被copy的时候就会运行")}val lambda: () -> Unitlambda = runnable::rungaoFun(true, lambda)}

4、inline定义

inline---内联函数

当我们在使用高阶函数的时候,因为除了高阶函数本身是个函数以外,它的参数或者返回值也是一个Lambda函数,lambda函数内部还有局部变量,当在编译运行的时候,因为每一个Lambda函数都是一个对象,并且还会捕获一个闭包及闭包内会访问到的变量。 这样在内存分配(对于函数对象和类)和虚拟机调用上都会加大运行时间开销。

为了解决高阶函数所带来的额外开销,kotlin加入了inline关键字。

注意:过多的使用inline关键字会对编译器造成很大的性能压力,所以我们建议只在高阶函数中使用inline关键字。

5、inline 原理

代码在编译以后,会将内联函数的函数体复制到调用处。

下面左边是我们的inline函数,右边是我们编译后的class文件。

从编译后的class可以看出,inline的函数体会被直接复制到调用该内联函数的地方。

Kotlin-5-高阶函数+Unit+Inline                          Kotlin-5-高阶函数+Unit+Inline

6、如何在AndroidStudio中查看kotlin编译后的class源码

第一步:选择你要查看你的kotlin文件,然后点击Tools-->Kotlin-->Show Kotlin Bytecode

Kotlin-5-高阶函数+Unit+Inline

第二步:点击左上角的 Decompile 按钮就会弹出你想要的class源码

Kotlin-5-高阶函数+Unit+Inline

  相关解决方案