Kotlin1.6.20好用的新特性:多receiver扩展函数,绝不可空类型,并行编译kotlin减少编译时间
前言
最近kotlin1.6.20新版本出來了,并帶來了幾個很好用的特性,來嘗嘗鮮
正文
1.多receiver擴(kuò)展函數(shù)
kt的擴(kuò)展函數(shù)大家應(yīng)該都懂,但什么是receiver呢?比如下面的代碼,是給View擴(kuò)展的,View就是這個receiver的類型,而this@click就是這個receiver對象
fun View.click(onClick: (View) -> Unit) {setOnClickListener {onClick(this@click)} }而多receiver那就是可以加多個this類型和對象,但有什么用呢?
比如我們定義一個點擊事件執(zhí)行在協(xié)程中的擴(kuò)展函數(shù)View.clickSuspend,我們可以用lifecycle的Scope,我們可以這樣寫:
但是這個clickSuspend函數(shù)只能在你的BaseActivity中定義,因為lifecycleScope是LifecycleOwner的擴(kuò)展屬性,而LifecycleOwner和View我們都是無法修改的,如果想要在Fragment中使用,又要在BaseFragment中定義一遍(現(xiàn)實情況可能更糟(無法修改父類)),此時我們使用多receiver擴(kuò)展函數(shù)就可以實現(xiàn)這種方式,如下圖所示
?其中View是主receiver,而context(LifecycleOwner)中的LifecycleOwner是副receiver,其可以有多個,主receiver用來顯式給類增加函數(shù)(語義上),而副receiver都只是隱式的,必須有其環(huán)境才能提示出此方法,比如上例中把View和LifecycleOwner顛倒則會找不到方法
其中this@方法名是獲取的主receiver,而如this@LifecycleOwner是獲取對應(yīng)的副receiver
由于以下問題,所以此特性需要手動開啟,且暫不建議在線上項目中使用
?ps:kotlin添加開啟此特性的編譯參數(shù)的方式:
//GroovykotlinOptions {jvmTarget = '1.8'freeCompilerArgs = ["-Xcontext-receivers"]//this} //Kts freeCompilerArgs = listOf("-Xcontext-receivers")2.絕不可空類型
絕不可控類型是什么類型呢?其實我覺得它就像是對kt類型漏洞的一種補(bǔ)充,我們可以看一下官網(wǎng)的代碼示例
?可以看出來,這個絕不可空類型是用來修飾泛型的,在泛型后加上&Any就可以表示這個參數(shù)或返回值肯定不會為空(經(jīng)測試這個&Any是個固定的搭配)
其實特性在某些情況下還是挺有用的,但是我沒想到簡單常用的示例2333...
ps:啟用這個特性需要手動開啟1.7版本或者等到1.7版本就正式啟用了:
kotlin {sourceSets.all {languageSettings {languageVersion = '1.7'}} }3.并行編譯kotlin減少編譯時間
編譯參數(shù)加上下面這行,可以開啟并行編譯kotlin,如果kotlin單體模塊是gradle編譯中比較耗時的任務(wù)時,開啟大概能減少15%的編譯時間
ps:這個N為0時表示每有一個cpu核心就會分配一個并行線程,其他數(shù)量則為你指定的數(shù)量,不要超過cpu核心數(shù),否則因為線程切換而減弱效果
-Xbackend-threads=N其他就是一些平時用不到的特性了,這三個可能以后會用到, end
參考:?What's new in Kotlin 1.6.20 | Kotlin
總結(jié)
以上是生活随笔為你收集整理的Kotlin1.6.20好用的新特性:多receiver扩展函数,绝不可空类型,并行编译kotlin减少编译时间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓使用Span富文本给某段Text文本
- 下一篇: Maven安装和配置及使用方法