Kotlin 1.3 发布,协程正式版发布啦


对本知识点有任何问题,可加我的个人微信:kymjs666

更新简介

  • 从 Kotlin 1.3 开始,协程将进入稳定状态。此后不再会被标注为experimental,官方也会提供相应的工具帮助开发者完成迁移工作。
  • Ktor,这个库的 API 已经完善,期待大家的使用体验和反馈。Ktor 是一个基于协程的框架,使用它我们可以优雅的构建 Web 应用、Http 服务、移动应用和网页。详细是使用方法可以查看极客时间视频课《快速上手 kotlin 开发》或者我的付费专栏:《Kotlin Primer》学习。
  • 程序入口 main 函数支持无参数的形式,它也可以是一个 suspend 函数。熟悉 Java 的同学一定知道,Java 语言的 main 函数限制参数必须有一个 String[] 类型。
  • 1.2.50 版本开始对脚本的支持也得到了更新和完善。
  • kotlinx.serialization 的插件已经合入 Kotlin 主工程,并且被集成到编译器插件当中。

迁移协程代码

从 Kotlin 1.3 开始,协程将进入稳定状态。鉴于此,大家可以在 1.3.0 发布之后就可以立刻马上迁移协程代码了,此后 kotlin 协程不再会被标注为experimental,官方也会提供相应的工具帮助开发者完成迁移工作。

coroutine 协程迁移过程注意事项

  1. 你需要在实验状态下(experimental) 更新到最新的版本,之前最新版是 0.26.1,协程正式版发布之后为1.0.0
  2. 将您的项目直接切换到 Kotlin 1.3,IDE 的工具会帮助您完成迁移,目前来说就是切换到 1.0.0,这个版本是基于 Kotlin 1.3 构建的。这个迁移工作主要是去掉包名当中的 experimental。
  3. 待 Kotlin 1.3 正式发版之后,kotlinx.coroutines也将会发布 1.0 版,届时您只需要更新版本号,重新编译代码即可。 需要注意的是,kotlinx.coroutines 1.0 将会丢弃所有之前的 0.26.x-eap13 版本中的废弃的接口和声明,与 版本并非二进制兼容,因此在切换正式版之前就需要把您代码中使用过时 API 的代码进行整理。
  4. kotlinx.coroutines也会有一些 API 被标记为“unstable”,它们将会在后续的更新中得到完善。尽管使用这些“unstable”的 API 需要特定的选项配置,但核心 API 都将在 1.0 最终确定并保证如同 Kotlin 标准库一样在后续更新中后向兼容。


Ktor 框架

协程发布了正式版,所以依赖它的 Ktor 异步框架也可以发布正式版了。
Ktor 是一个用于连接应用的异步框架。它包括一个跨平台的 HTTP 客户端和一个基于 JVM 的 HTTP 服务端。

客户端目前已经支持 JVM/Android 和 iOS,后续也将支持更多的平台包括 JS(浏览器)和各种各样的 native 平台。服务端则运行在 JVM 上面,您可以使用 Netty、Jetty 以及其他类似于 Tomcat 的 servlet 容器。

详细是使用方法可以查看极客时间视频课《快速上手 kotlin 开发》或者我的付费专栏:《Kotlin Primerhttps://xiaozhuanlan.com/kotlinlang 学习。

不需要参数的 main 函数

就像C语言那样,从 Kotlin 1.3 开始允许 “main” 函数的字符串数组参数可选。此后 “Hello, World!” 在 Kotlin 当中就更短了:

fun main() {
    println("Hello, World!")
}


Range 迭代时的元素空检查

value 是可空类型,同时 RangeIterable且范围较大时,在 value in from..to 中进行空检查将非常耗时。这种情况下,范围的包含关系判断会退化成 Iterable<T>.contains(T),这样整个过程就成了 Iterable 的遍历(直到元素找到或者确定找不到为止)。

为了解决这个问题,我们引入了一系列 contains 的重载,以 IntRange.contains(element: Int?) 为例,它会先检查参数 element 是否为空,紧接着执行一个快速的包含关系判断:

class IntRange(start: Int, endInclusive: Int) : IntProgression(start, endInclusive, 1), ClosedRange<Int> {
    ...
    override fun contains(value: Int): Boolean = first ≤ value && value ≤ last
    ...
}

@SinceKotlin("1.3")
public inline operator fun IntRange.contains(element: Int?): Boolean {
    return element != null && contains(element)
}


协程的 SuccessOrFailure 类更名为 Result

在之前的 Kotlin 1.3 预览版中,官方提供了一个封装 Kotlin 函数结果的类 SuccessOrFailure,经过 review 和社区反馈,这个版本更名为Result。这个类目前主要应用于协程,作为Continuation.resumeWith的参数。Kotlin 中有许多设计线索可用于将来扩展错误处理,这将要求我们重新设计使用此Result类作为返回类型的代码的语义。因此,为避免将来的设计会破坏此类代码,Kotlin 1.3 编译器会对于这类声明报错,当然标准库函数的一些情况则是例外,因为这些函数仅用于对 Result 类型进行操作。详细请参见 KEEP-127


废弃整型、浮点型混合的区间包含运算符

整型区间遇到浮点型参数会有这样的情况,例如 3.14 in 1..3 是可以编译运行的,但结果就有点儿尴尬了: true。我们废弃了这样的 contains 运算符重载,后面会逐渐移除它们。