天天看点

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

目录

1、定义:

2、Unit的定义

3、高阶函数的实现:

4、inline定义

5、inline 原理

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

1、定义:

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

2、Unit的定义

3、高阶函数的实现:

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

fun gaoFun(isSay: Boolean, lambda: () -> Unit) {
    if (isSay) {
        println("高阶函数的参数lambda()匿名函数传了进来")

        lambda()
    }
}

//main()函数的Unit就是省略的。(这里我特意加上了)
fun main(): Unit {

    //这里我们将lambda匿名函数传给了gaoFun
    gaoFun(false, { println("我是高阶函数") })

    //因为gaoFun函数的最后一个参数是Lambda,所以我们可以将lambda匿名函数放在小括号的后面
    gaoFun(true) { println("我也可以放在这里") }

    
    /**
     * 这里我声明了一个Runnable匿名内部类,然后将匿名内部类的run匿名函数赋值给了lambda
     */
    val runnable = Runnable {
        println("我是一个Runnable,我在被copy的时候就会运行")
    }

    val lambda: () -> Unit

    lambda = runnable::run

    gaoFun(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

继续阅读