前言
最近kotlin1.6.20新版本出来了,并带来了几个很好用的特性,来尝尝鲜
正文
1.多receiver扩展函数
kt的扩展函数大家应该都懂,但什么是receiver呢?比如下面的代码,是给View扩展的,View就是这个receiver的类型,而this@click就是这个receiver对象
fun View.click(onClick: (View) -> Unit) {
setOnClickListener {
onClick(this@click)
}
}
而多receiver那就是可以加多个this类型和对象,但有什么用呢?
比如我们定义一个点击事件执行在协程中的扩展函数View.clickSuspend,我们可以用lifecycle的Scope,我们可以这样写:
但是这个clickSuspend函数只能在你的BaseActivity中定义,因为lifecycleScope是LifecycleOwner的扩展属性,而LifecycleOwner和View我们都是无法修改的,如果想要在Fragment中使用,又要在BaseFragment中定义一遍(现实情况可能更糟(无法修改父类)),此时我们使用多receiver扩展函数就可以实现这种方式,如下图所示
其中View是主receiver,而context(LifecycleOwner)中的LifecycleOwner是副receiver,其可以有多个,主receiver用来显式给类增加函数(语义上),而副receiver都只是隐式的,必须有其环境才能提示出此方法,比如上例中把View和LifecycleOwner颠倒则会找不到方法
其中this@方法名是获取的主receiver,而如this@LifecycleOwner是获取对应的副receiver
由于以下问题,所以此特性需要手动开启,且暂不建议在线上项目中使用
ps:kotlin添加开启此特性的编译参数的方式:
//Groovy
kotlinOptions {
jvmTarget = '1.8'
freeCompilerArgs = ["-Xcontext-receivers"]//this
}
//Kts
freeCompilerArgs = listOf("-Xcontext-receivers")
2.绝不可空类型
绝不可控类型是什么类型呢?其实我觉得它就像是对kt类型漏洞的一种补充,我们可以看一下官网的代码示例
可以看出来,这个绝不可空类型是用来修饰泛型的,在泛型后加上&Any就可以表示这个参数或返回值肯定不会为空(经测试这个&Any是个固定的搭配)
其实特性在某些情况下还是挺有用的,但是我没想到简单常用的示例2333...
ps:启用这个特性需要手动开启1.7版本或者等到1.7版本就正式启用了:
kotlin {
sourceSets.all {
languageSettings {
languageVersion = '1.7'
}
}
}
3.并行编译kotlin减少编译时间
编译参数加上下面这行,可以开启并行编译kotlin,如果kotlin单体模块是gradle编译中比较耗时的任务时,开启大概能减少15%的编译时间
ps:这个N为0时表示每有一个cpu核心就会分配一个并行线程,其他数量则为你指定的数量,不要超过cpu核心数,否则因为线程切换而减弱效果
-Xbackend-threads=N
其他就是一些平时用不到的特性了,这三个可能以后会用到, end
参考: What's new in Kotlin 1.6.20 | Kotlin
对Kotlin或KMP感兴趣的同学可以进Q群 101786950
如果这篇文章对您有帮助的话
可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)