前言

最近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减少编译时间相关推荐

  1. jdk1.5新特性5之枚举之模拟枚举类型

    一 简单应用 package cn.xy.Enum; public enum TrafficLamp {  RED,GREEN,YELLOW; } TrafficLamp red = TrafficL ...

  2. Java SE7新特性之泛型实例创建时的类型推断

    Java SE7新特性之泛型实例创建时的类型推断 标签: JDK7泛型 2014-01-04 15:34 6015人阅读 评论(0) 收藏 举报  分类: Java基础(9)  只要编译器从上下文中能 ...

  3. JAVA8新特性之 判断 list 是否为空进行 foreach 遍历

    JAVA8新特性之 判断 list 是否为空进行 foreach 遍历 ArrayList<String> dateList = new ArrayList<>(); Opti ...

  4. 2020.10.20课堂笔记(java8新特性 lambda表达式)

    一.什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个"值". 如果你想把"一块代码"赋给一个Java变量,应该怎么做呢? 比如,我想把右 ...

  5. C# 3.0新特性系列(1):隐含类型局部变量

    一.隐含类型局部变量简介 在C#3.0中增加了很多新的语言特性,如果有一个局部变量被声明为var,这个声明被视为隐含类型局部变量声明,然后由编译器根据局部变量初始化表达式来推断变量的类型.如下面的声明 ...

  6. JDK8新特性(十五)之重复注解、类型注解

    一.重复注解 自从Java 5中引入注解以来,注解开始变得非常流行,并在各个框架和项目中被广泛使用.不过注解有一个很大的限制是:在同一个地方不能多次使用同一个注解.JDK8引入了重复注解的概念,允许在 ...

  7. 【Java 8 新特性】Java Comparator.nullsFirst | 将空元素被认为小于非空元素

    Java Comparator.nullsFirst | 将空元素被认为小于非空元素 使用 Comparator.nullsFirst 参考文献 nullsFirst是比较器功能接口的静态方法. Ja ...

  8. Java 8 新特性——实践篇

    Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的学生对象里各种成绩进行过滤时,比如大于85分获得A的学生集合,最初的方式是写不同的方法处理不同的科目成绩过滤: ...

  9. 跨平台的 .NET 运行环境 Mono 3.2 新特性

    Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...

最新文章

  1. 数据结构与算法:01 绪论
  2. AI硬件碎片化难题,英特尔想用“一个API”解决,还推出新的编程语言DPC++
  3. 用神经网络模拟分子:碱金属的氯化物
  4. 下面有关java类加载器牛客网_下面有关java classloader说法错误的是?
  5. 《Java 核心技术卷1 第10版》学习笔记------调试技巧
  6. 1060. 爱丁顿数(25)
  7. linux下getrlimit与sysconf函数
  8. 万字总结Keras深度学习中文文本分类
  9. 51nod 1605:棋盘问题
  10. Selenium2 + Python3.6实战(五):生成HTML测试报告 Invalid argument
  11. windows使用小技巧 ━━ windows11的WLAN图标突然消失的解决办法,wifi没了可以找回来,一般的驱动突然坏了都可以用这个方法找回
  12. 光纤跳线接口_你知道光纤接头、尾纤、终端盒的作用与接法嘛?读懂这篇足够...
  13. Java方法 (含计算器代码)
  14. Velocity的使用
  15. csp php,了解CSP
  16. pycharm 学生资格过期,提示No suitable licenses associated with account解决方案
  17. 容器化(docker)
  18. bzoj1812[Ioi2005] riv
  19. Github 首页美化教程 —— 美,是第一生产力
  20. 疯狂天才乔治·霍兹:17岁黑掉苹果,22岁搞垮索尼,还是特斯拉、谷歌最可怕的对手!...

热门文章

  1. 点云网络的论文理解(三)-点云网络的优化 PointNet++的总体说明
  2. 线性代数笔记:汉克尔矩阵(Hankel matrix)
  3. 强化学习笔记: backup diagram
  4. 数据科学家们,请补齐你的短板,如何提升R语言编程能力
  5. Django startproject的问题
  6. 【Cocos2d实例教程一】xcode5下Cocos2d环境的搭建
  7. 2000万日订单背后:美团外卖客户端高可用建设体系
  8. Java多线程编程那些事:volatile解惑--转
  9. 你所知道及不知道的骗贷、中介、欺诈团伙是怎么样的
  10. 引擎讲解2--主要是MyISAM和InnoDB的区别