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){
    
}

四、总结

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

目录
相关文章
|
2月前
|
Kotlin
Kotlin注释
Kotlin注释
181 0
|
2月前
|
Kotlin
Kotlin函数
Kotlin函数
183 0
|
安全 Java 编译器
3 亿美元的 bug,Kotlin 帮你避免 | 内联类 value class
3 亿美元的 bug,Kotlin 帮你避免 | 内联类 value class
104 0
|
Java Kotlin
Kotlin中内联函数的作用是什么?
在以前,因为学过一段时间Kotlin(并没有实际开发中用过),很多东西都忘记了,但是kotlin的代码看起来其实和Java没什么区别,感觉都差不多。所以不要认为 Kotlin 很难学。
192 0
|
安全 IDE Java
又被 Kotlin 语法糖坑惨的一天
又被 Kotlin 语法糖坑惨的一天
190 0
又被 Kotlin 语法糖坑惨的一天
|
JavaScript 前端开发 Java
浅谈Kotlin中的函数
本文简单谈下Kotlin中的函数,包括表达式函数体,命名参数,默认参数,顶层函数,扩展函数,局部函数,Lambda表达式,成员引用,with/apply函数等。从例子入手,从一般写法到使用特性进行简化,再到原理解析。
1125 0
|
移动开发 安全 Java
Kotlin学习之关键字
Kotlin学习之关键字
115 0
|
XML Java Android开发
kotlin 之几个常见的内联函数(六)—— 总结篇
本篇内容对内联函数做了一个总结,分别是let、with、run、apply、also
106 0
|
Java Kotlin
kotlin 之几个常见的内联函数(五)
适用于let函数的任何场景,also函数和let很像,只是唯一的不同点就是let函数最后的返回值是最后一行的返回值而also函数的返回值是返回当前的这个对象。一般可用于多个扩展函数链式调用。
150 0
|
Java Kotlin
kotlin 之几个常见的内联函数(三)
适用于let,with函数任何场景。因为run函数是let,with两个函数结合体,准确来说它弥补了let函数在函数体内必须使用it参数替代对象,在run函数中可以像with函数一样可以省略,直接访问实例的公有属性和方法,另一方面它弥补了with函数传入对象判空问题,在run函数中可以像let函数一样做判空处理
131 0