如何在Kotlin模式匹配可选项?

是否有可能写这样的东西,还是我们不得不恢复到Kotlin手动空检查?

val meaningOfLife : String? = null when meaningOfLife { exists -> println(meaningOfLife) else -> println("There's no meaning") } 

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

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

这是编译器执行智能转换的特例。

is Stringelse分支可以实现类似的效果 – is String – 如果值不为null,则检查为true。

更多关于无效安全的成语请看这个答案 。

你可以做到这一点如下:

 val meaningOfLife: String? = null when (meaningOfLife) { is String -> println(meaningOfLife) else -> println("There's no meaning") } 

仅供参考,在问题的具体情况有一个简单的解决方案与默认值的?:操作符:

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

在这个问题中的例子可能是一个简化的真实情况,所以一个空检查是如何做到这一点。 恕我直言, if是一个更好的方式去当你有一个二进制选择的控制流程:

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

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

尝试这个:

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

让stdlib