Kotlin 1.7.0测试版启用绝对不可置空的类型

154 阅读4分钟

Kotlin 1.7.0测试版启用绝对不可置空的类型

JetBrains发布了Kotlin1.7.0-Beta,启用了构建器推理,默认情况下肯定是非空的类型,并重新引入了 min(), max(), minBy(), maxBy(), **minWidth()**和 **maxWith()**函数。正则表达式现在支持Kotlin/JSKotlin/Native中的命名捕捉组,并允许在特定位置检查精确匹配。

从1.7.0版本开始,"里程碑 "版本现在被称为 "Beta "版本,以与标准的软件发布周期术语保持一致。"Beta "意味着没有增加新的功能,重点是在社区反馈的帮助下稳定这些功能。要在1.7.0-Beta版中使用这些新功能,请配置Early Access Preview中的构建脚本

Kotlin 1.4发布后, **min()**和 **max()**集合函数被重新命名为 **minOrNull()**和 **maxOrNull()**因为它们在集合为空时返回 **null**当集合为空时,返回可比函数,如 minBy(), maxBy(), **minWidth()**和 **maxWidth()**也被重新命名,在函数名称的末尾加入 OrNull()在函数名称的结尾处。这个最新版本重新引入了min(), max(), minBy(), maxBy(), **minWidth()**和 **maxWith()**函数,它们现在会返回集合元素或抛出一个异常。

fun main() {
    val intList = listOf<Int>()


    // The following statement prints null
    println(intList.minOrNull())

    // The following statement prints 
    //     "Exception in… Collection is empty."
    println(intList.min())
}

构建器推理是类型推理的一种形式,它帮助编译器根据传递的lambda内的调用推断出类型参数,而不需要显式类型参数:

val answerMap = buildMap {
    put("The answer to life, the universe, and everything", 42)
}

构建器推理的实现是在Kotlin 1.5.30中引入的,目前这个版本默认启用了1.6版本中作为编译器标志引入的后备构建器推理,只要常规的类型推理不能为一个类型检索到足够的信息。这使得编写使用类型推理的自定义构建器成为可能,无需任何注释或编译器标志。

Kotlin 1.7.0自动启用了对Kotlin 1.6.20中引入的绝对非空类型的支持,以提高扩展通用Java类和接口时的互操作性。语法 **T & Any**语法可以用来标记一个通用类型的参数绝对不可为空,例如,在覆盖一个带有一个 **@NotNull**参数时:

// Java method:
@NotNull
public T calculate(@NotNull T x) {}

// Kotlin method:
override fun calculate(x: T1 & Any): T1 & Any

**Regex.matchAt()**和 **Regex.matchesAt()**引入于Kotlin 1.5.30,现在是稳定的,可以用来验证一个正则表达式是否在一个 **String**或 CharSequence:

myRegex.matchesAt(text, 42) // returns true or false
myRegex.matchAt(text, 42) // returns the match or null

Kotlin/JVM、Kotlin/JS 和 Kotlin/Native 现在都支持通过使用 **(?<name>group)**语法在正则表达式中使用。新的 **MatchGroupCollection.get()**函数可用于通过提供组的名称来检索组所匹配的文本:

val regex = "(?<movie>[A-Za-z\\s]+):(?<year>[0-9]{4})".toRegex()
val movie = "The Fellowship of the Ring:2001"

val match = regex.find(movie)!!

// The following statement prints The Fellowship of the Ring
println(match.groups["movie"]?.value)

// The following statements print 2001
println(match.groups["year"]?.value)
println(match.groups[2]?.value)

组名也可以在回溯组的时候使用,以匹配与捕获组相同的文本,通过使用 **\k<name>**语法。命名的组可以与替换表达式一起使用,如 **replace()**和 **replaceFirst()**等函数,其中替换字符串中出现的 **${name}**在替换字符串中的出现会被具有相同名称的捕获组替换:

val regex = "(?<movie>[A-Za-z\\s]+):(?<year>[0-9]{4})".toRegex()
val movie = "The Fellowship of the Ring:2001"

// The following statement prints 2001-The Fellowship of the Ring
println(regex.replace(movie, "\${year}-\${movie}"))

新的Kotlin/Native内存管理器现在可以作为Alpha版本使用,并带来更好的性能和开发者体验。新的内存管理器通过消除JVM和Native平台之间的差异,使开发者在创建跨平台应用程序(如Android和iOS)时的体验更加轻松。这个解决方案将在未来的版本中成为默认选项,可以通过遵循迁移说明进行测试。

Kotlin博客提供了这个版本的完整概述,在测试中遇到的任何问题都可以在YouTrack上报告。