如何在Kotlin模式匹配选项?

Tom*_*Tom 15 control-flow kotlin

是否有可能写出这样的东西,或者我们是否必须恢复到Kotlin中的手动空值检查?

val meaningOfLife : String? = null

when meaningOfLife {
    exists -> println(meaningOfLife)
    else   -> println("There's no meaning")
}
Run Code Online (Sandbox Code Playgroud)

hot*_*key 17

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

val meaningOfLife: String? = null

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

这是编译器执行的智能强制转换的特例.

使用is Stringelsebranches 可以实现类似的效果- is String当值不为null时,-check为true.

有关无效安全的更多习语,请参阅此答案.

  • @EPadronU,不完全:从字节码的角度来看,“is String”会导致“instanceof”检查,而答案中的代码不会,它只会将引用与“null”进行比较。 (2认同)

EPa*_*onU 12

您可以按如下方式完成:

val meaningOfLife: String? = null

when (meaningOfLife) {
  is String -> println(meaningOfLife)
  else -> println("There's no meaning")
}
Run Code Online (Sandbox Code Playgroud)