学习Kotlin之内联函数

 内联函数的功能

 在Kotlin高阶函数中,我们了解到Lambda表达式实际上是会带来额外的内存和性能开销的。

 而内敛函数的作用就是将Lambda表达式带来的运行时开销完全消除。

 内联函数的用法

 只需要在定义高阶函数时加上inline关键字即可。

    inline fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int{
        val result = operation(num1,num2)
        return result
    }

内联函数的工作原理

 Kotlin编译器会将内联函数中的代码在编译的时候自动替换到调用它的地方,这样也就不存在运行时的开销了。

 第一步: Lambda表达式中的代码替换到函数类型参数调用的地方。

 第二步:再将内联函数中的全部代码替换到函数调用的地方。

 最后的代码就被替换成如下:

 所以内联函数完全消除了Lambda表达式带来的运行时开销。

 

 noinline

 特殊情况:一个高阶函数中如果接收了两个或者更多函数类型的参数,这时加上了inline关键字,那么Kotlin编译器会自动将所有引用的Lambda表达式全部进行内联。

 但如果我们只想内联其中的一个Lambda表达式,就可以使用noinline关键字了,如下所示:

    inline fun inlineTest(block1: () -> Unit, noinline block2: () -> Unit){
    }

 使用inline关键字声明了inlineTest()函数,原本block1和block2这两个函数类型参数所引用的Lambda表达式都会被内联。但是我们在block2参数的前面又加上了一个noinline关键字,那么现在就只会对block1参数所引用的Lambda表达式进行内联了。

 为什么会存在noinline?

 因为内联的函数类型参数在编译的时候会被进行代码替换,因此它没有真正的参数属性。非内联的函数类型参数可以自由地传递给其他任何函数,因为它就是一个真实的参数,而内联的函数类型参数只允许传递给另外一个内联函数,这也是它最大的局限性。

 此外,内联和非内联有一个重要的区别:内联函数所引用的Lambda表达式中是可以使用return关键字来进行函数返回的,而非内联函数只能进行局部返回。

 Lambda表达式中是不允许直接使用return关键字的,这里使用了return@printString的写法(printString是一个高阶函数,非内联),表示进行局部返回,并且不再执行Lambda表达式的剩余部分代码。

 将printString()函数变成内联函数,Lambda表达式中使用return关键字了。

 

posted @   PeacefulGemini  阅读(466)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
回顶部
点击右上角即可分享
微信分享提示