更新简介
- 从 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 协程迁移过程注意事项
- 你需要在实验状态下(experimental) 更新到最新的版本,之前最新版是 0.26.1,协程正式版发布之后为1.0.0
- 将您的项目直接切换到 Kotlin 1.3,IDE 的工具会帮助您完成迁移,目前来说就是切换到
1.0.0
,这个版本是基于 Kotlin 1.3 构建的。这个迁移工作主要是去掉包名当中的 experimental。 - 待 Kotlin 1.3 正式发版之后,
kotlinx.coroutines
也将会发布 1.0 版,届时您只需要更新版本号,重新编译代码即可。 需要注意的是,kotlinx.coroutines 1.0
将会丢弃所有之前的 0.26.x-eap13 版本中的废弃的接口和声明,与 版本并非二进制兼容,因此在切换正式版之前就需要把您代码中使用过时 API 的代码进行整理。 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 Primer》https://xiaozhuanlan.com/kotlinlang 学习。
不需要参数的 main 函数
就像C语言那样,从 Kotlin 1.3 开始允许 “main” 函数的字符串数组参数可选。此后 “Hello, World!” 在 Kotlin 当中就更短了:
fun main() {
println("Hello, World!")
}
Range 迭代时的元素空检查
在 value
是可空类型,同时 Range
是 Iterable
且范围较大时,在 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
运算符重载,后面会逐渐移除它们。