Kotlin 1.6 有哪些新变化?

在这里插入图片描述
Kotlin 1.6推出了新功能、改进的实验性内存管理器和增强的标准库。这些新增功能有助于成熟 JetBrains 日益流行的跨平台和跨学科语言。

新的本机内存管理器

可以说 Kotlin 生态系统的最大变化是 Kotlin Native 新内存管理器的到来。虽然它仍被标记为开发者预览版,但更新后的管理器代表了 Kotlin 未来的发展方向。

修改后的设计能够更好地处理用于将 Kotlin 转换为适用于 iOS 和 Android 的本机平台代码的不同编译后端。有时,平台需要针对特定操作进行不同的优化。当前的方法对并发性施加了限制,并且可能会在没有开发人员特别注意的情况下造成内存泄漏。

下一代内存管理器解决了这些缺点。它为可安全使用的并发操作提供无泄漏原语。这些更改还使本机内存管理与用于 JVM 开发的现有内存管理器更加一致。

虽然新系统在 Kotlin 1.6 中可用,但目前不打算用于生产。在某些情况下,与传统内存管理器相比,性能最多可降低5 倍。一个高性能版本的开发工作正在进行中,该版本已准备好被普遍采用。

密封时声明

Sealedwhen语句让您在忘记处理可能的情况时收到编译器警告。如果您将密封类、布尔类型或枚举传递给 a when,您通常希望对每个可能的输入值采取明确的行动方案:

sealed class Drivetrain {
    data class Electric(val Power: Int) : Drivetrain()
    data class Diesel(val Power: Int) : Drivetrain()
    data class Hybrid(val Diesel: Drivetrain, val Electric: Drivetrain) : Drivetrain()} fun getTotalPowerKwh(drivetrain: DriveTrain) : Int {
    when (drivetrain) {
        is Drivetrain.Diesel -> drivetrain.Diesel.Power
        is Drivetrain.Electric -> drivetrain.Electric.Power
    }}

在上面的示例中,Drivetrain密封类中包含三个数据类。该when语句仅处理其中两个——如果您的代码接收混合动力传动系统,将返回错误值。

Kotlin 编译器现在会提醒您注意这个问题。在 Kotlin 1.7 中,没有详尽地涵盖所有可能性将导致编译错误。

暂停类型转换

从常规类型到挂起类型的转换已通过自动编译器转换得到稳定。当您将正则类型表达式传递到需要挂起类型的上下文时,编译器将自动创建转换。

这将启用如下代码:

fun createUser(name: String) {
    // ...
    } 
flow.collect(::createUser)
 val createUserFunction = ::createUser
flow.collect(createUserFunction)

此代码用于在第二次flow.collect()调用时中断。该createUserFunction变量指的是常规函数定义,而不是第一次调用创建的暂停。Kotlin 现在将通过在接收上下文需要时创建一个挂起的版本来处理这个问题。

现在也支持挂起函数作为超类型。这使您可以在当前支持挂起函数引用的任何地方传递实现挂起函数类型的类。

class ImplementsSuspendingFunctionalType : suspend () -> Unit {
    override suspend fun invoke() { /* ... */ }
    }

该suspend () -> Unit接口的实现方式与您已经可以() -> Unit用于非挂起类型的方式相同。

代码覆盖扫描器

Kotlin 现在有一个官方的代码覆盖率扫描工具。Kover是一个 Gradle 插件,用于收集 Kotlin JVM、多平台和混合 Java 项目的测试覆盖率统计信息。它可以生成 HTML 和 XML 格式的报告。

Kover 与 Kotlin 语言及其 Gradle 工具链完全兼容。虽然一些第三方工具已经可以提供覆盖率分数,但它们存在于生态系统之外,并不总是能够了解每项任务。Kover 提供了一种完全集成的方法。这个初始版本标记为实验性的开发正在进行中。

要启用 Kover,请将以下几行添加到您的顶级构建文件中:

plugins {
     id("org.jetbrains.kotlinx.kover") version "0.4.2"
}

Kover 现在将作为您的 Gradle 构建的一部分运行。

标准库添加

标准库有一些值得注意的变化,包括将几个 beta 函数提升为稳定:

readln()readlnOrNull()

这两个新函数从标准输入流中读取并返回一行。如果达到 EOF 标记,前者将抛出,而后者返回null。

类型()

该typeOf()函数可让您T在运行时确定具体化类型的实际类型,通常表示为。

inline fun <reified T> getTypeString() : String {
    val type = typeOf<T>()
    return type.toString()}

集合构建器

新的构建器函数让您可以轻松地从一组不同的值创建集合。您可以使用一流的函数将映射、列表和集合组合到新的集合中:

val fruits = listOf("apple", "banana");
val veg = listOf("carrot", "cabbage"); 
val groceries = buildList {
    add("milk")
    addAll(fruits)
    addAll(veg)
    }
     // ["milk", "apple", "banana", "carrot", "cabbage"]

持续时间值

Duration表示时间值的类已升级为稳定类。它提供了一种集成类型来在您的代码中存储时间段持续时间。该类具有便于单位之间轻松转换的方法:

// Emits 1.0
println(60.toDuration(DurationUnit.SECONDS).inMinutes);

更多标准库更改

整数有新的rotateLeft()和rotateRight()功能。这些将数字的二进制表示按指定的方向旋转指定的位数。正则表达式为Java 和 JavaScript 环境以及跨 Java 和 JavaScript 环境获得序列拆分功能和一致的行为。replace()replaceFirst()

一些现有功能已被弃用。的concat(),match()以及matches()对字符串的函数,以及在sort()阵列上的功能,现在会发出警告。它们的功能已经包含在替代选项中。

其他变化

Kotlin 1.6 添加了一些生态系统增强和生活质量改进。其中包括对 Xcode 13 的支持以及在任何平台上编译 Windows 构建的能力。如果您的目标是 WindowsmingwX64或mingwX86Windows,您现在可以从任何支持 Kotlin/Native 开发的系统进行编译。

对 Linux 和 iOS 构建的编译器缓存的改进已将首次运行后的典型构建时间减半。Kotlin 依赖链的更新显着减少了磁盘使用。切换到 LLVM 11.1已将macOS 版本从 1200 MB 减少到 300 MB 左右。

如果您使用的是 Kotlin JavaScript,现在可以在构建过程中禁用Node.js 和 Yarn 的自动下载。当您在主机已安装这些依赖项的预配置环境中编译代码时,这很有用。

概括

Kotlin 1.6 是一个健康的版本,具有新的实验性功能,为前进铺平了道路,并提供了您今天可以使用的语言和标准库更改的良好名册。Kotlin 版本之间的互操作性也得到了改进,因此无论是为 JVM、Native 还是 JavaScript 编译,更多代码的行为都相同。

1.6 里程碑还看到 Kotlin 的维护者为旧 API 版本提供了延长的支持期。现在将支持滚动节奏的三个以前的版本。这意味着您目前可以选择针对 Kotlin 1.3 到 1.6 版本进行开发,从而让您有更多时间在不同版本之间进行升级。

您现在可以通过更新您的 IntelliJ IDEA、Android Studio、Xcode 或 Kotlin CLI 编译器版本来迁移到 Kotlin 1.6。值得首先查看兼容性指南,以确保您已经解决了之前报告的所有会在 1.6 中引发警告或错误的弃用问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mikes zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值