千家信息网

Kotlin中内联函数的示例分析

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章将为大家详细讲解有关Kotlin中内联函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。内联函数的理解inline函数(内联函数)从概念上讲是编译
千家信息网最后更新 2025年02月02日Kotlin中内联函数的示例分析

这篇文章将为大家详细讲解有关Kotlin中内联函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

内联函数的理解

inline函数(内联函数)从概念上讲是编译器使用函数实现的真实代码来替换每一次的函数调用,带来的最直接的好处就是节省了函数调用的开销,而缺点就是增加了所生成字节码的尺寸。基于此,在代码量不是很大的情况下,我们是否有必要将所有的函数定义为内联?让我们分两种情况进行说明:

  1. 将普通函数定义为内联:众所周知,JVM内部已经实现了内联优化,它会在任何可以通过内联来提升性能的地方将函数调用内联化,并且相对于手动将普通函数定义为内联,通过JVM内联优化所生成的字节码,每个函数的实现只会出现一次,这样在保证减少运行时开销的同时,也没有增加字节码的尺寸;所以我们可以得出结论,对于普通函数,我们没有必要将其声明为内联函数,而是交给JVM自行优化。

  2. 将带有lambda参数的函数定义为内联:是的,这种情况下确实可以提高性能;但在使用的过程中,我们会发现它是有诸多限制的,让我们从下面的例子开始展开说明:

inline fun doSomething(action: () -> Unit) { println("Before doSomething...") action() println("After doSomething...")}

假如我们这样调用doSomething:

fun main(args: Array) { doSomething {  pringln("Hello World") }}

上面的调用会被编译成:

fun main(args: Array) { println("Before doSomething...") println("Hello World") println("After doSomething...")}

从上面编译的结果可以看出,无论doSomething函数还是action参数都被内联了,很棒,那让我们换一种调用方式:

fun main(args: Array) { val action:() -> Unit = { println("Hello World") } doSomething(action)}

上面的调用会被编译成:

fun main(args: Array) { println("Before doSomething...") action() println("After doSomething...")}

doSomething函数被内联,而action参数没有被内联,这是因为以函数型变量的形式传递给doSomething的lambda在函数的调用点是不可用的,只有等到doSomething被内联后,该lambda才可以正常使用。

通过上面的例子,我们对lambda表达式何时被内联做一下简单的总结:

  • 当lambda表达式以参数的形式直接传递给内联函数,那么lambda表达式的代码会被直接替换到最终生成的代码中。

  • 当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修饰符就可以了。

以上便是我对内联函数的全部理解,通过掌握该特性的运行机制,相信大家可以做到在正确的时机使用该特性,而非滥用或因恐惧弃而不用。

关于"Kotlin中内联函数的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

函数 代码 参数 表达式 面的 编译 例子 普通 字节 形式 情况 篇文章 生成 示例 分析 必要 变量 地方 就是 尺寸 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 通信网络技术举例说明 党员教育管理数据库咋注册 考研复试数据库原理课后习题九 深圳互联网先锋科技有限公司 怀旧服新开服务器怎么登陆 oracle数据库闪回操作 过磅系统软件开发公司电话 华为网络安全官接受采访 有什么方法采集网贷数据库 宣城餐饮软件开发哪家好 管理服务器的密码是什么 网络安全类图片素材 辽宁中国数据库技术大会 正常一套软件开发到上线流程 县环保局网络安全应急预案 服务器raid卡厂家 服务称赞的零信任架构网络安全 棉城猫王互联网科技公司最新招聘 t3系统管理如何添加服务器 全民奇迹服务器数据库名字 数据库一般连接怎么运算符 近3年金融网络安全事件 网络安全名词 吉林特种网络技术优势 服务器区拓扑 计算机网络技术中AS是什么 安卓系统用什么软件开发 网络安全法 案 如何安装T 数据库 厦门雅迅网络技术面试
0