内容简介:11 月 16 日,JebTrain 发布了 Kotlin 1.6.0 ,其中包含稳定的详尽 whens 声明、Kover 和 Kotlin/Native 的新内存管理器,1.5.30 中发布的其他语言和标准库功能也变得更稳定。 密封(详尽)when 声明 Sealed whe...
11 月 16 日,JebTrain 发布了 Kotlin 1.6.0 ,其中包含稳定的详尽 whens
声明、Kover 和 Kotlin/Native 的新内存管理器,1.5.30 中发布的其他语言和标准库功能也变得更稳定。
密封(详尽)when
声明
Sealed when
是一项期待已久的功能,如果你的 when 语句不够详尽,Kotlin 编译器发会警告。
Kotlin 会详尽地检查封闭类、枚举和布尔类型的表达式,使用那些代数数据类型对域建模时,它非常有用的。例如对应用程序的用户有不同的契约首选项,建模为一个封闭的类层次结构:
sealed class Contact {
data class PhoneCall(val number: String) : Contact()
data class TextMessage(val number: String) : Contact()
data class InstantMessage(val type: IMType, val user: String) : Contact()
}
现在,如果你写了一个表达式:根据不同的联系人偏好返回不同的结果。但是又忘记处理应用程序中的所有类型,编译器将会标记一个错误:
fun Rates.computeMessageCost(contact: Contact): Cost =
when (contact) { // ERROR: 'when' expression must be exhaustive
is Contact.PhoneCall -> phoneCallCost
is Contact.TextMessage -> textMessageCost
}
在 Kotlin 1.6.0 之前,这种问题编译器只会报弱 IDE 检查,从 Kotlin 1.6 开始,它会产生以下编译器警告(warning):
Non-exhaustive 'when' statements on sealed class/interface will be prohibited in 1.7. Add an 'is InstantMessage' branch or 'else' branch instead.
在 Kotlin 1.7 中它会变成一个错误(ERROR),详情可参阅 KT-47709 。
Suspending 函数作为超类型
Kotlin 1.6 稳定了对将 suspend
挂起函数类型实现为超级接口的功能。
设计 Kotlin API 需要自定义各种库函数的行为时,接受函数类型是惯用的做法。例如,kotlinx.coroutines
API 在其 Job 接口中有一个成员函数,看起来类似于:
fun invokeOnCompletion(handler: () -> Unit)
可以方便地使用像 invokeOnCompletion {doSomething()}
这些 lambda 函数。如果想要处理完成的类,可以通过在类中直接实现函数 type () -> Unit 来简化和优化代码,而不需要创建额外的 lambda 。
class MyCompletionHandler : () -> Unit {
override fun invoke() { doSomething() }
}
从Kotlin 1.6开始,这种优化可以通过挂起函数实现。如果你的 api 接受挂起函数类型,像这样:
public fun launchOnClick(action: suspend () -> Unit) {}
那么我们就不再局限于传递 lambda 和挂起函数引用了,也可以在类中实现相应的挂起函数类型:
class MyClickAction : suspend () -> Unit {
override suspend fun invoke() { doSomething() }
}
挂起转换
Kotlin 1.6 稳定了从常规到挂起函数类型的转换。现在可以传递任何常规函数类型的表达式,其中使用预期挂起作为参数,编译器将自动执行转换。
改进了递归泛型类型的类型推断
从1.6.0开始,如果默认情况下是递归泛型,Kotlin编译器能根据相应类型形参的上限推断类型实参。这可以实现使用递归泛型类型创建各种模式(通常在 Java 中用于制作构建器 API):
// Before 1.5.30
val containerA = PostgreSQLContainer(DockerImageName.parse("postgres:13-alpine")).apply {
withDatabaseName("db")
withUsername("user")
withPassword("password")
withInitScript("sql/schema.sql")
}
// With compiler option in 1.5.30 or by default starting with 1.6.0
val containerB = PostgreSQLContainer(DockerImageName.parse("postgres:13-alpine"))
.withDatabaseName("db")
.withUsername("user")
.withPassword("password")
.withInitScript("sql/schema.sql")
Builder inference 改进
Kotlin 1.5.30 引入了 -Xunrestricted-builder-inference
编译器选项,让关于构建器调用的类型信息可以在构建器 lambda 中获取。也就是说,它引入了调用返回尚未推断类型的实例的能力,比如 buildList() lambda 中的 get()
。
从 1.6.0 开始,无需指定 -Xunrestricted-builder-inference
进行以前禁止的调用。现在可以使用-Xenable-builder-inference 编译器选项编写自己的泛型构建器,而不需要应用 @BuilderInference
注释,且如果常规类型推断无法解析类型信息,你还可以自动启用 Builder inference构建器推断。
长期支持以前的 API 版本
从 Kotlin 1.6.0 开始可以使用三个以前的 API 版本进行开发,目前可用的 API 版本包括 1.3、1.4、1.5 和 1.6。
Kotlin/JVM
具有运行时保留的可重复注释。 Kotlin 与 Java 8 一样具有可重复的注释。在 Kotlin 1.6 中,该功能与 Java 兼容,@kotlin.annotation.Repeatable
现在接受任何保留并让注释在 Kotlin 和 Java 中都可重复。
Kotlin 端现在也支持 Java 可重复注释。
Kotlin/Native
- 现在可以尝试新 Kotlin/Native 内存管理器的实验版。此功能致力于在多平台项目中提供一致的开发体验。新的内存管理器解除了对线程间对象共享的现有限制,并提供完全无泄漏的并发编程原语,这些原语是安全的,不需要开发人员进行任何特殊管理或注释。
- Kotlin/Native 现在支持 Xcode 13。
- 在任何主机上编译 Windows 目标,现在可以在任何支持 Kotlin/Native 的主机上编译 Windows 目标
mingwX64
和mingwX86
。 - Kotlin 1.6.0 重新设计了 Kotlin/Native 在幕后使用的 LLVM 依赖项,同时将 LLVM 版本更新到 11.1.0 ,并减少了依赖项大小。
- 带有 JVM 和 JS IR 后端的统一编译器插件 ABI。现在,Kotlin 多平台 Gradle 插件能够将可嵌入的编译器 jar(用于 JVM 和 JS IR 后端的那个)用于 Kotlin/Native,这意味着可以为 Native 和其他支持的平台使用相同的编译器插件工件。
稳定的 typeOf()
Kotlin 1.6.0 带来了稳定的 typeOf()
。从 1.3.40 开始,typeOf()
作为实验性 API 在 JVM 平台上可用,现在可以在任何 Kotlin 平台上使用它,且 KType
编译器可以推断任何 Kotlin 类型的表示。
inline fun renderType(): String {
val type = typeOf()
return type.toString()
}
fun main() {
val fromExplicitType = typeOf()
val fromReifiedType = renderType>()
}
稳定的集合构建器
buildMap()
,buildList()
和 buildSet()
已经稳定,构建器返回的集合现在可以在只读状态下序列化。
稳定的整数位旋转操作
将数字的二进制表达式向左或向右旋转指定位数的 rotateLeft()
和 rotateRight()
函数已经稳定。
val number: Short = 0b10001
println(number.rotateRight(2).toString(radix = 2)) // 100000000000100
println(number.rotateLeft(2).toString(radix = 2)) // 1000100
稳定正则表达式函数
稳定了splitToSequence()
——一个用于将字符串拆分为序列的正则表达式函数
val colorsText = "green, red , brown&blue, orange, pink&green"
val regex = "[,\\\\s]+".toRegex()
val mixedColor = regex.splitToSequence(colorsText)
.onEach { println(it) }
.firstOrNull { it.contains('&') }
println(mixedColor) // "brown&blue"
有关 Kotlin 1.6.0 的详尽信息可在发布公告中查看。
以上所述就是小编给大家介绍的《Kotlin 1.6.0 发布,大量新特性与功能稳定》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Swift 5 新特性详解:ABI 稳定终于来了!
- Apache Kafka 2.5 稳定版发布,新特性抢先看
- Kotlin 1.3-M2 发布,带来新特性并提升了稳定性
- Kotlin 1.3 新特性抢先看,协程已稳定并将向后兼容
- 稳定与非稳定版本软件的Docker Image构建策略
- Virpus西雅图VPS测评:稳定的XEN架构,稳定的速度,非常适合建站
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序是怎样跑起来的
[日] 矢泽久雄 / 李逢俊 / 人民邮电出版社 / 2015-4 / 39.00元
本书从计算机的内部结构开始讲起,以图配文的形式详细讲解了二进制、内存、数据压缩、源文件和可执行文件、操作系统和应用程序的关系、汇编语言、硬件控制方法等内容,目的是让读者了解从用户双击程序图标到程序开始运行之间到底发生了什么。同时专设了“如果是你,你会怎样介绍?”专栏,以小学生、老奶奶为对象讲解程序的运行原理,颇为有趣。本书图文并茂,通俗易懂,非常适合计算机爱好者及相关从业人员阅读。一起来看看 《程序是怎样跑起来的》 这本书的介绍吧!