如何在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 String
和else
分支可以实现类似的效果 – 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