Kotlin:将'cascade if'替换为'when'与其他变量进行比较

时间:2018-05-03 19:36:38

标签: android if-statement kotlin

我从Kotlin开始,我遇到了一个问题。 我有三个常量(我们称之为VAL_A,VAL_B和VAL_C),我正在进行此分配:

var variable = if (value < VAR_A) {
            valueA
        } else if (value <= VAR_B) {
            valueB
        } else if (value <= VAR_C) {
            valueC
        } else {
            valueD
        }

我想使用when块而不是if else,但我不知道怎么做值&lt; VAR_A和值&gt; VAR_C个。

谢谢你,对不起我的英语!

3 个答案:

答案 0 :(得分:6)

您可能正在寻找的理想语法是

when (value) {
    < valueA -> valueA
    <= valueB -> valueB
    <= valueC -> valueC
    else -> valueD
}

不幸的是,这是不可能的,因为需要接收器的函数comparison operators are operator overloads

value < valueA

相同
value.compareTo(valueA) < 0

由于compareTo不是像isin这样的关键字(在zsmb13的回答中使用),您需要创建此when块:

when {
    value < valueA -> valueA
    value <= valueB -> valueB
    value <= valueC -> valueC
    else -> valueD
}

Kotlin充满了美好的事物。您可以冒险尝试一些不使用级联条件的替代解决方案。在我看来,您希望value向上舍入到最近的valueAvalueBvalueCvalueD。因此,例如,替代方案可能是:

var variable = listOf(valueA, valueB, valueC, valueD).sorted().first { value <= it }

这将从集合中选择大于value的最接近的值,并将其分配给variable

答案 1 :(得分:4)

这应该是您{%url%}表达式的最简单的等价物:

if

答案 2 :(得分:2)

例如,如果0 <&lt; 0&lt; 0&lt; 0 VAR_A&lt; VAR_B&lt; VAR_C,你可以这样做:

var variable = when (value) {
    in 0..VAR_A -> valueA
    in VAR_A..VAR_B -> valueB
    in VAR_B..VAR_C -> valueC
    else -> valueD
}

但也许这是when最易读的形式:

var variable = when {
    value <= VAR_A -> valueA
    value <= VAR_B -> valueB
    value <= VAR_C -> valueC
    else -> valueD
}