如何在Kotlin模式匹配选项?

时间:2016-06-03 09:24:49

标签: kotlin control-flow

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

val meaningOfLife : String? = null

when meaningOfLife {
    exists -> println(meaningOfLife)
    else   -> println("There's no meaning")
}

4 个答案:

答案 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 Stringelse分支可以实现类似的效果 - 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>

let in stdlib