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

DAA*_*DAA 6 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
        }
Run Code Online (Sandbox Code Playgroud)

我想使用when块而不是if else,但是我不知道如何执行值<VAR_A和值> VAR_C的值。

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

M. *_*ich 7

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

when (value) {
    < valueA -> valueA
    <= valueB -> valueB
    <= valueC -> valueC
    else -> valueD
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是不可能的,因为比较运算符是需要接收器的函数的运算符重载

value < valueA
Run Code Online (Sandbox Code Playgroud)

是相同的

value.compareTo(valueA) < 0
Run Code Online (Sandbox Code Playgroud)

因为compareTo不是类似于isor 的关键字in(如zsmb13的答案中所使用),所以您需要创建以下代码when块:

when {
    value < valueA -> valueA
    value <= valueB -> valueB
    value <= valueC -> valueC
    else -> valueD
}
Run Code Online (Sandbox Code Playgroud)

科特林充满了美好的事物。您可以尝试一些根本不使用级联条件的替代解决方案。像你想在我看来value,以四舍五入到最接近的valueAvalueBvalueC,和valueD。因此,例如,替代方法可能是:

var variable = listOf(valueA, valueB, valueC, valueD).sorted().first { value <= it }
Run Code Online (Sandbox Code Playgroud)

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

  • 那正是我的问题,我不知道我可以在没有参数的情况下使用。非常感谢! (2认同)

zsm*_*b13 6

例如,如果 0 < VAR_A< VAR_B<为真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
}
Run Code Online (Sandbox Code Playgroud)

when但也许这是此任务最清晰的形式:

var variable = when {
    value <= VAR_A -> valueA
    value <= VAR_B -> valueB
    value <= VAR_C -> valueC
    else -> valueD
}
Run Code Online (Sandbox Code Playgroud)


s1m*_*nw1 5

这应该是您的if表达式最简单的等效项:

var variable = when {
    value < VAR_A -> valueA
    value <= VAR_B -> valueB
    value <= VAR_C -> valueC
    else -> valueD
}
Run Code Online (Sandbox Code Playgroud)