Kotlin1.6.20好用的新特性:多receiver扩展函数,绝不可空类型,并行编译kotlin减少编译时间

前言

最近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

如果这篇文章对您有帮助的话

可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值