Kotlin中的内联

简介: 内联本质上就是用空间换取时间的一个操作,将被关键字修饰的函数或者其它属性直接嵌入主函数中,使得加载的过程中函数的运行效率大大提高,Kotlin中的内联和其他语言的内联差不多,只是分的更细,由于自身语言的特性又有一些新的用法。

一、前言

内联本质上就是用空间换取时间的一个操作,将被关键字修饰的函数或者其它属性直接嵌入主函数中,使得加载的过程中函数的运行效率大大提高,Kotlin中的内联和其他语言的内联差不多,只是分的更细,由于自身语言的特性又有一些新的用法。

二、内联函数

1. inline 的用法

只需在函数前加inline关键字即可实现函数的内联

inline fun inlineTest(){
    println("wresource write")
}

这样就实现了函数的内联,即嵌入主函数中进行执行,这样做的好处是使用此函数时不需要再次调用函数进行代码的执行,坏处是由于不是在函数中执行,可能会消耗更多的内存,但执行速度就快很多,这些的实现细节可以查看class文件的反编译文件进行求证,这里就不展示了

2. noinline 的用法

当我们遇到一个场景,有些参数不需要内联,这时候如果还是inline开头的函数就默认都是内联,所以noinline就此产生,满足我们的个性化需求

//这边为了比较明显的比较效果选择函数型参数的内联和禁用内联比较
inline fun someNoinlineTest(doInline:() -> Unit,noinline doNoInline:() -> Unit){
    //这里的invoke时执行lambda表达式的意思
    doInline.invoke()
    doNoInline.invoke()
}

同样这边也可以对内联进行反编译的验证,这部分有兴趣的可以试试

3. crossinline 的用法

一般来讲lambda表达式是不能进行返回的,但内联函数比较特殊,是直接嵌入主函数中进行执行的,故使用inline的lambda表达式就可以进行局部的返回,这时又出现了一个问题,不想要返回怎么办?crossinline就这样出现了,利用crossinline修饰的lambda表达式不允许返回

inline fun crossLineTest(crossinline lambda:() -> Unit){
    normal{
        lambda()
    }
}
//主函数
fun main(){
    noinlineTest(::doSomething1,::doSomething2)
    crossLineTest {
        //会报错
        return
    }
}

上述部分将lambda表达式和函数类型讲的有点乱了,不过其实二者其实是一样的,差别不是很大,至少在kotlin这个语言中是这样的

三、内联属性和内联类

这部分和内联函数的原理是一样的,同样也是为了提高速度牺牲内存

1.内联属性

在getter或者setter前添加inline关键字即可

//给get方法设置内联
val func : Func
    inline get() = ...

//给set方法设置内联
var func2 : Func2
    get() = ...
    inline set(s) {...}

//给整个属性设置内联
inline var func3 :Func3
        get() = ...
        set(s){...}

内联其他特性和内联函数的用法类似就不过多叙述了,貌似使用的也不多,一般内联函数的实现较多

2.内联类

这个作用仍然是减少运行时间的损耗,

在kotlin 1.3版本时是使用inline进行修饰内联类

//主构造函数必须有一个不可变的属性
inline class Test(val name:String){
    
}

在kotlin1.5 版本时进一步提高内联类的性能,使用value代替inline进行内联的修饰

value class Test(val name:String){
    
}

四、总结

总体来讲内联就是为了提高运行速度以空间换取时间,不能滥用,使用场景需要比较合适的情况下才能发挥其最大的作用,有问题欢迎评论区留言哦

目录
相关文章
|
JavaScript
【vue】vue2 禁用控制台、右键 | 代码防扒
【vue】vue2 禁用控制台、右键 | 代码防扒
519 2
|
存储 缓存 NoSQL
跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯一ID、红包、消息同步等功能,并且还支持集群部署。
13872 1
|
数据可视化 数据挖掘 数据管理
问卷调查数据分析指南!掌握方法,精准把握用户需求!
本文介绍了如何利用自定义报表、交叉报表和过滤器进行问卷调查数据分析。文章首先区分了定量和定性数据,强调了定量数据在分析中的重要性,并列举了客户体验(CSAT、CES、NPS)和市场调研的关键指标。接着,提到了定性数据分析方法,如情感分析和词云图。文章还讨论了自定义报表、交叉报表和过滤器在数据筛选和相关性探索中的作用,以及收集器在多源数据收集上的应用。最后,强调了仪表板在数据可视化和比较中的优势,并推荐了Zoho Survey作为综合的数据管理平台。
765 0
问卷调查数据分析指南!掌握方法,精准把握用户需求!
|
JavaScript API
Vue3中的计算属性能否动态修改
【9月更文挑战第5天】Vue3中的计算属性能否动态修改
641 10
|
8月前
|
人工智能 IDE 开发工具
寻找Cursor的替代品:10款AI编程工具深度评测与推荐·优雅草卓伊凡
寻找Cursor的替代品:10款AI编程工具深度评测与推荐·优雅草卓伊凡
5896 18
寻找Cursor的替代品:10款AI编程工具深度评测与推荐·优雅草卓伊凡
|
监控 安全 数据挖掘
Python自动化交易
【8月更文挑战第7天】随着科技发展,自动化交易成为高效智能的投资方式。Python因其实用性和灵活性,在此领域大放异彩。本文介绍使用Python进行自动化交易的流程,包括获取市场数据、制定交易策略、执行交易、风险管理、监控与优化、实时监控及通知、心态管理、安全与隐私保护以及持续学习与优化等方面,并提供了具体的代码示例。通过这些步骤,读者可以构建自己的自动化交易系统,实现稳健的投资回报。
|
JavaScript
【vue】 将Vue2中的console.log()调试信息移除
【vue】 将Vue2中的console.log()调试信息移除
491 0
|
数据采集 JavaScript 开发者
无法打开浏览器开发者工具的可能解决方法
无法打开浏览器开发者工具的可能解决方法
427 4
|
JSON 数据安全/隐私保护 数据格式
钉钉事件订阅的地址需要在钉钉开放平台进行配置
【2月更文挑战第7天】钉钉事件订阅的地址需要在钉钉开放平台进行配置
398 6
|
机器学习/深度学习 数据采集 人工智能
人工智能,应该如何测试?(二)数据挖掘篇
在AI模型开发中,数据起着决定性作用,模型的性能往往受限于数据的质量和量级。建模工程师大部分时间都在与数据打交道,而中国在AI发展上与国外的主要差距并不在于计算能力,而是高质量的数据。测试人员不仅需要评估模型效果,也需要处理数据,包括数据采集、质量监控、构造、ETL(提取、转换、加载)和特征工程等。