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

如何使用Kotlin将嵌套的if-else语句更改为when语句?,kotlin,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

我有下面的代码块,希望使用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
}

更短的方法:迭代数组而不是
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)
        }
    }
}

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

when(name) {
    nameArray[0] -> // do something
    nameArray[1] -> // do something
    nameArray[2] -> // do something
    nameArray[3] -> // do something
    else -> // other action
}
你可以用它来确定你身体状况的最小指数。然后您可以使用
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
}

您可以在时使用
,将其简化如下

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
}
并且拥有
Names
enum类型的
name
,然后可以使用下面的
when
子句,这是一种更简洁的方式,更具可读性

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

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

它的工作原理与switch-case构造类似,但您也可以使用expression,查看更多信息

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

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
    }
}

也许我误解了你想要做的事情,但在我看来,当一个陈述过于复杂化时。在原始代码中,您只需要确定数组是否在0到3的任何索引中包含
name
值,并做出相应的响应

if ((nameArray.indexOfFirst(name::equals) in 0..3) { 
    // The statement
} else {
    // The else branch
}

你真的要在数组中检查同一个索引三次吗?还是打字错误?这里嵌套了什么?好的,现在修复了它。这回答了你的问题吗?您可以反过来迭代
nameArray
,因为
name
保持不变,不是吗?您能否提供一个最小的示例和
nameArray
的确切类型?您可以在0中使用
i,直到nameArray
而不是
0..(nameArray.size-1)
,它不短,但可能更容易阅读:)@WilliMentzel关于
nameArray.indexes
?@xinaiz或者更好的
用于机械索引的
:)@WilliMentzel也可以使用
迭代器。。。科特林有很多可能性;-)我承认,它们中的大多数都比我的示例更具可读性……在最坏的情况下(假设数组有一百万个项,匹配项是最后一个)
nameArray.indexOfFirst{it==name}
将花费您3、4次以上的简单比较,如question@mightyWOZ是的,但是要为每一种情况列出一项行动是不可行的(使用
when
您似乎建议的内容)也可以。答案是根据问题及其用例量身定制的。它应该简短明了。首先,问题没有说明数组的大小。(可以是5或5000000)第二,这个问题只涉及五种情况,而不考虑数组的大小,这可以由when@mightyWOZ好的,我明白你的意思了。我在想OP想要覆盖数组的所有情况(因为它从零开始,有连续的索引)(这意味着它不会那么大)。不过,如果数组不是很大,我很可能会同意我的建议,特别是因为答案的第二部分。无论如何,谢谢你的评论。问题并不完全清楚,但他可能想为不同的索引做不同的事情。