是否可以写这样的东西,或者我们是否必须恢复到Kotlin中的手动空值检查?
val meaningOfLife : String? = null
when meaningOfLife {
exists -> println(meaningOfLife)
else -> println("There's no meaning")
}
答案 0 :(得分:16)
其中一种可能的方法是首先匹配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
- 当值不为空时,检查为真。
有关无效安全的更多习语,请参阅this answer。
答案 1 :(得分:11)
您可以按如下方式完成:
val meaningOfLife: String? = null
when (meaningOfLife) {
is String -> println(meaningOfLife)
else -> println("There's no meaning")
}
答案 2 :(得分:1)
仅供参考,问题中的特定情况是使用默认值为?:
运算符的简单解决方案:
println(meaningOfLife ?: "There's no meaning")
问题中的示例可能是简化的实际情况,因此我会如何进行空检查。当你有一个选择控制流的二进制文件时,恕我直言if
是一个更好的方法:
if(meaningOfLife != null)
println(meaningOfLife)
else
println("There's no meaning")
采用完全相同的行数,BTW。
答案 3 :(得分:0)
试试这个:
<solver>
<scanAnnotatedClasses/>
<scoreDirectorFactory>
<scoreDefinitionType>HARD_SOFT</scoreDefinitionType>
<scoreDrl>solver/rules.drl</scoreDrl>
</scoreDirectorFactory>
<constructionHeuristic>
<constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>
</constructionHeuristic>
<termination>
<secondsSpentLimit>60</secondsSpentLimit>
</termination>
<localSearch>
<termination>
<maximumUnimprovedStepCount>100</maximumUnimprovedStepCount>
</termination>
</localSearch>
</solver>