如何使用Kotlin将嵌套的if-else更改为when语句?

时间:2020-01-29 13:54:53

标签: kotlin

我有以下代码块,并希望使用Kotlin减少它。我该怎么办?

if (name == nameArray[0]) {
    // The statement
} else if(name == nameArray[1]) {
    // The statement
} else if(name == nameArray[2]) {
    // The statement
} else if(name == nameArray[3]) {
    // The statement
} else {
    // The statement
}

5 个答案:

答案 0 :(得分:4)

如果数组很小,并且您想将操作映射到每个索引:

您可以使用indexOfFirst来确定满足您状况的最小索引。然后,您可以使用when语句来决定要做什么。

when(nameArray.indexOfFirst{ it == name }) {
    0 -> // do something
    1 -> // do something else
    //...
    else -> // do something different
}

如果您可能想对多个索引执行相同的操作,则可以使用逗号分隔的值。如果索引是连续的,则可以使用范围:

when(nameArray.indexOfFirst{ it == name }) {
    0 -> // do something
    1, 2 -> // do the same thing for 1 and 2
    in 3..6 -> // do the same thing for 3, 4, 5 and 6
    //...
    else -> // do something different
}

为了使用这种语法,最好先进行索引检索(如图所示)。

如果数组很大,而您真的只想检查特定元素:

when(name) {
    nameArray[0] -> // do something
    nameArray[1] -> // do something
    nameArray[2] -> // do something
    nameArray[3] -> // do something
    else -> // other action
}

答案 1 :(得分:2)

您可以使用when将其简化如下

when(name) {
    nameArray[0] -> //statement
    nameArray[1] -> //statement
    nameArray[2] -> //statement
    nameArray[3] -> //statement
    else -> //statement
}

或者,如果您可以使用枚举代替下面的nameArray

enum class Names {
    NAME_1, NAME_2, NAME_3
}

并拥有name枚举类型的Names,则可以如下使用when子句,这是一种更简洁的方法,而且可读性更高

when(name) {
    Names.NAME_1 -> //statement
    Names.NAME_2 -> //statement
    Names.NAME_3 -> //statement
}

答案 2 :(得分:1)

您可以使用更好更强大的Kotlin构造when

它与切换用例的构造类似,但是您也可以使用表达式,请查看here以了解更多信息。

针对您的示例,您可以编写:

when (name) {
    nameArray[0] -> {
    //The statement
    }
    nameArray[1] -> {
    //The statement
    }
    nameArray[2] -> {
    //The statement
    }
    nameArray[3] -> {
    //The statement
    }
    else -> { 
    //Executes when conditions are not met
    }
}

答案 3 :(得分:1)

也许我是在误解您想做的事情,但是在我看来,when语句使这一过程变得过于复杂。在您的原始代码中,您只想确定数组是否在0到3的任何索引中包含std::stack值,并做出相应的响应。

name

答案 4 :(得分:0)

更简单的方法:迭代数组,而不是if-else数组的每个可能索引:

fun main(args: Array<String>) {
    val nameArray: Array<String> = arrayOf("naam", "nombre", "name", "Name")
    val name: String = "name";

    for (i in 0..(nameArray.size - 1)) {
        if (name == nameArray[i]) {
            println("The statement should be executed on index " + i)
        }
    }
}

输出:

The statement should be executed on index 2