时间:2021-05-20
前言
看了很多博客,才明白了内联的含义,其实最根本的就是将写在别处的代码拷贝到你现在执行的方法中,相当于在一个方法中执行,java的方法执行是需要压栈出栈的对吧,如果是两三个方法那就是两三次的压栈出栈,为了节省这个操作,提高一定的效率,kotlin就出了这么个函数。但又想想,如果是个超级大的函数,考来考去的也是很麻烦啊,所以这东西需要自己权衡吧,遵守单一职责,降低代码圈发杂度才是根本。
内联函数的理解
inline函数(内联函数)从概念上讲是编译器使用函数实现的真实代码来替换每一次的函数调用,带来的最直接的好处就是节省了函数调用的开销,而缺点就是增加了所生成字节码的尺寸。基于此,在代码量不是很大的情况下,我们是否有必要将所有的函数定义为内联?让我们分两种情况进行说明:
假如我们这样调用doSomething:
fun main(args: Array<String>) { doSomething { pringln("Hello World") }}上面的调用会被编译成:
fun main(args: Array<String>) { println("Before doSomething...") println("Hello World") println("After doSomething...")}从上面编译的结果可以看出,无论doSomething函数还是action参数都被内联了,很棒,那让我们换一种调用方式:
fun main(args: Array<String>) { val action:() -> Unit = { println("Hello World") } doSomething(action)}上面的调用会被编译成:
fun main(args: Array<String>) { println("Before doSomething...") action() println("After doSomething...")}doSomething函数被内联,而action参数没有被内联,这是因为以函数型变量的形式传递给doSomething的lambda在函数的调用点是不可用的,只有等到doSomething被内联后,该lambda才可以正常使用。
通过上面的例子,我们对lambda表达式何时被内联做一下简单的总结:
上面对lambda的内联时机进行了讨论,消化片刻后让我们再看最后一个例子:
inline fun doSomething(action: () -> Unit, secretAction: () -> Unit) { action() doSomethingSecret(secretAction)}fun doSomethingSecret(secretAction: () -> Unit) {}上面的例子是否有问题?是的,编译器会抛出“Illegal usage of inline-parameter”的错误,这是因为Kotlin规定内联函数中的lambda参数只能被直接调用或者传递给另外一个内联函数,除此之外不能作为他用;那我们如果确实想要将某一个lambda传递给一个非内联函数怎么办?我们只需将上述代码这样改造即可:
inline fun doSomething(action: () -> Unit, noinline secretAction: () -> Unit) { action() doSomethingSecret(secretAction)}fun doSomethingSecret(secretAction: () -> Unit) {}很简单,在不需要内联的lambda参数前加上noinline修饰符就可以了。
以上便是我对内联函数的全部理解,通过掌握该特性的运行机制,相信大家可以做到在正确的时机使用该特性,而非滥用或因恐惧弃而不用。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言Kotlin一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅,下面总结了在开发中经常用到的一些内联扩展函数
前言在Kotlin中的源码标准库(Standard.kt)中提供了一些Kotlin扩展的内置函数可以优化kotlin的编码。Standard.kt是Kotlin
Kotlin开发Android应用实例详解相关文章:关于Kotlin语言的基础介绍:我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单
(1)什么是内联函数?内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。(2)为什么要引入内联函数?当然,引入内联函数的主要目的是:解决程序中
介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如复制代码代码如下:#defineT