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添加开启此特性的编译参数的方式:
//GroovykotlinOptions {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
Kotlin1.6.20好用的新特性:多receiver扩展函数,绝不可空类型,并行编译kotlin减少编译时间相关推荐
- jdk1.5新特性5之枚举之模拟枚举类型
一 简单应用 package cn.xy.Enum; public enum TrafficLamp { RED,GREEN,YELLOW; } TrafficLamp red = TrafficL ...
- Java SE7新特性之泛型实例创建时的类型推断
Java SE7新特性之泛型实例创建时的类型推断 标签: JDK7泛型 2014-01-04 15:34 6015人阅读 评论(0) 收藏 举报 分类: Java基础(9) 只要编译器从上下文中能 ...
- JAVA8新特性之 判断 list 是否为空进行 foreach 遍历
JAVA8新特性之 判断 list 是否为空进行 foreach 遍历 ArrayList<String> dateList = new ArrayList<>(); Opti ...
- 2020.10.20课堂笔记(java8新特性 lambda表达式)
一.什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个"值". 如果你想把"一块代码"赋给一个Java变量,应该怎么做呢? 比如,我想把右 ...
- C# 3.0新特性系列(1):隐含类型局部变量
一.隐含类型局部变量简介 在C#3.0中增加了很多新的语言特性,如果有一个局部变量被声明为var,这个声明被视为隐含类型局部变量声明,然后由编译器根据局部变量初始化表达式来推断变量的类型.如下面的声明 ...
- JDK8新特性(十五)之重复注解、类型注解
一.重复注解 自从Java 5中引入注解以来,注解开始变得非常流行,并在各个框架和项目中被广泛使用.不过注解有一个很大的限制是:在同一个地方不能多次使用同一个注解.JDK8引入了重复注解的概念,允许在 ...
- 【Java 8 新特性】Java Comparator.nullsFirst | 将空元素被认为小于非空元素
Java Comparator.nullsFirst | 将空元素被认为小于非空元素 使用 Comparator.nullsFirst 参考文献 nullsFirst是比较器功能接口的静态方法. Ja ...
- Java 8 新特性——实践篇
Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的学生对象里各种成绩进行过滤时,比如大于85分获得A的学生集合,最初的方式是写不同的方法处理不同的科目成绩过滤: ...
- 跨平台的 .NET 运行环境 Mono 3.2 新特性
Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...
最新文章
- 数据结构与算法:01 绪论
- AI硬件碎片化难题,英特尔想用“一个API”解决,还推出新的编程语言DPC++
- 用神经网络模拟分子:碱金属的氯化物
- 下面有关java类加载器牛客网_下面有关java classloader说法错误的是?
- 《Java 核心技术卷1 第10版》学习笔记------调试技巧
- 1060. 爱丁顿数(25)
- linux下getrlimit与sysconf函数
- 万字总结Keras深度学习中文文本分类
- 51nod 1605:棋盘问题
- Selenium2 + Python3.6实战(五):生成HTML测试报告 Invalid argument
- windows使用小技巧 ━━ windows11的WLAN图标突然消失的解决办法,wifi没了可以找回来,一般的驱动突然坏了都可以用这个方法找回
- 光纤跳线接口_你知道光纤接头、尾纤、终端盒的作用与接法嘛?读懂这篇足够...
- Java方法 (含计算器代码)
- Velocity的使用
- csp php,了解CSP
- pycharm 学生资格过期,提示No suitable licenses associated with account解决方案
- 容器化(docker)
- bzoj1812[Ioi2005] riv
- Github 首页美化教程 —— 美,是第一生产力
- 疯狂天才乔治·霍兹:17岁黑掉苹果,22岁搞垮索尼,还是特斯拉、谷歌最可怕的对手!...