如何在 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")
一种可能的方法是首先匹配 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 String
和else
分支可以达到类似的效果——is String
-当值不为空时检查为真。
有关空安全的更多习语,请参阅。
仅供参考,问题中的特定情况有一种使用默认值 ?:
运算符的简单解决方案:
println(meaningOfLife ?: "There's no meaning")
问题中的例子可能是一个简化的真实情况,所以空检查是我会做的。恕我直言 if
是一种更好的方式,当您有控制流的二元选择时:
if(meaningOfLife != null)
println(meaningOfLife)
else
println("There's no meaning")
采用完全相同的行数,顺便说一句。
是否可以这样写,或者我们是否必须在 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")
一种可能的方法是首先匹配 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 String
和else
分支可以达到类似的效果——is String
-当值不为空时检查为真。
有关空安全的更多习语,请参阅
仅供参考,问题中的特定情况有一种使用默认值 ?:
运算符的简单解决方案:
println(meaningOfLife ?: "There's no meaning")
问题中的例子可能是一个简化的真实情况,所以空检查是我会做的。恕我直言 if
是一种更好的方式,当您有控制流的二元选择时:
if(meaningOfLife != null)
println(meaningOfLife)
else
println("There's no meaning")
采用完全相同的行数,顺便说一句。