Kotlin 1.9.0 版本已正式发布,JVM 的 K2 编译器现已处于测试阶段。此版本包含新的语言功能以及 Kotlin Multiplatform 和 Kotlin/Native 的改进。
以下是此版本的重要内容:
新的 Kotlin K2 编译器更新
Kotlin 团队继续稳定 K2 编译器,1.9.0 版本引入了进一步的改进。 JVM 的 K2 编译器现在处于 Beta 阶段。
现在已提供对 Kotlin/Native 和多平台项目的基本支持。
枚举类值函数的稳定替换
在 1.8.20 中,枚举类的 entries 属性作为实验功能引入。 entries 属性是 values() 函数的现代且高性能的替代品。
在 1.9.0 中, entries 属性已经稳定。虽然仍支持 values() 函数,但官方建议改用 entries 属性。
enum class Color(val colorName: String, val rgb: String) {
RED("Red", "#FF0000"),
ORANGE("Orange", "#FF7F00"),
YELLOW("Yellow", "#FFFF00")
}
fun findByRgb(rgb: String): Color? = Color.entries.find { it.rgb == rgb }
用于开放式范围的稳定 ..< 运算符
用于开放式范围的新 ..< 运算符在 Kotlin 1.7.20 中引入,并在 1.8.0 中变得稳定。在 1.9.0 中,用于处理开放式范围的标准库 API 也已稳定。
新的 ..< 运算符使声明开放式范围时更容易理解。如果使用 until 函数,很容易被错误地理解成包含上限。
以下是使用 until 函数的示例:
fun main() {
for (number in 2 until 10) {
if (number % 2 == 0) {
print("$number ")
}
}
// 2 4 6 8
}
这是使用新的 ..< 运算符的示例:
fun main() {
for (number in 2..<10) {
if (number % 2 == 0) {
print("$number ")
}
}
// 2 4 6 8
}
新的通用函数:通过名称获取正则表达式捕获组
在 1.9.0 中有一个通用函数 groups ,可以使用它通过正则表达式匹配的名称检索组的内容。在想要访问属于特定捕获组的正则表达式匹配结果时,这非常有用。
以下是包含三个捕获组的正则表达式的示例: city 、 state 和 areaCode 。可以使用这些组名称来访问匹配的值:
fun main() {
val regex = """\b(?<city>[A-Za-z\s]+),\s(?<state>[A-Z]{2}):\s(?<areaCode>[0-9]{3})\b""".toRegex()
val input = "Coordinates: Austin, TX: 123"
val match = regex.find(input)!!
println(match.groups["city"]?.value)
// Austin
println(match.groups["state"]?.value)
// TX
println(match.groups["areaCode"]?.value)
// 123
}
用于创建父目录的新路径实用程序
1.9.0 中,有一个新的扩展函数 createParentDirectories() ,可以使用它来创建包含所有必需父目录的新文件。
createParentDirectories() 在复制文件时特别有用。例如,您可以将其与 copyToRecursively() 函数结合使用:
sourcePath.copyToRecursively(
destinationPath.createParentDirectories(),
followLinks = false
)
Kotlin 多平台中的 Gradle 配置缓存预览
Kotlin 1.9.0 支持多平台库中的 Gradle 配置缓存,库作者已经可以从改进的构建性能中受益。Gradle 配置缓存通过在后续构建中重用配置阶段的结果来加快构建过程。自 Gradle 8.1 以来,该功能已变得稳定。
注意:Kotlin Multiplatform 插件仍然不支持带有 Xcode 集成任务的 Gradle 配置缓存或 Kotlin CocoaPods Gradle 插件。