如何在 Kotlin 中模式匹配可选值?

How to pattern match optionals in Kotlin?

是否可以这样写,或者我们是否必须在 Kotlin 中恢复到手动空检查?

val meaningOfLife : String? = null

when meaningOfLife {
    exists -> println(meaningOfLife)
    else   -> println("There's no meaning")
}

您可以按如下方式完成:

val meaningOfLife: String? = null

when (meaningOfLife) {
  is String -> println(meaningOfLife)
  else -> println("There's no meaning")
}

试试这个:

val meaningOfLife : String? = null    
meaningOfLife?.let { println(it) } ?: println("There's no meaning")

let in stdlib

一种可能的方法是首先匹配 null,以便在 else 分支中 String? 隐式转换为 String:

val meaningOfLife: String? = null

when (meaningOfLife) {
    null -> println("There's no meaning")
    else -> println(meaningOfLife.toUpperCase()) //non-nullable here
}

这是编译器执行的 smart cast 的特例。

使用is Stringelse分支可以达到类似的效果——is String-当值不为空时检查为真。

有关空安全的更多习语,请参阅

仅供参考,问题中的特定情况有一种使用默认值 ?: 运算符的简单解决方案:

println(meaningOfLife ?: "There's no meaning")

问题中的例子可能是一个简化的真实情况,所以空检查是我会做的。恕我直言 if 是一种更好的方式,当您有控制流的二元选择时:

if(meaningOfLife != null)
    println(meaningOfLife)
else
    println("There's no meaning")

采用完全相同的行数,顺便说一句。