Kotlin - 从列表中删除一个元素 when 和 let

Mic*_*lny 1 kotlin

我发现从 kotlin 中的列表中删除一个when放置在里面的项目let需要添加一个else分支,我不明白为什么需要它。谁能解释一下?

请参阅以下示例。

有一个可为空的列表

val list = mutableListOf<Int?>(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
Run Code Online (Sandbox Code Playgroud)

我想在空检查后从列表中删除一个元素。使用let和when需要else分支的实现。

fun `remove element inside let and when`(random: Int) {
    list[random]?.let {
        when {
            it > 4 -> list.remove(it)
            else -> { //else branch required
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我使用的元素从列表中when,但没有let的else分支不需要

fun `remove element inside when`(random: Int) {
    when {
        random > 4 -> list.remove(random)
        //no else branch required
    }
}
Run Code Online (Sandbox Code Playgroud)

当if被用来代替when在let该else分支也不需要

fun `remove element inside let and if `(random: Int) {
    list[random]?.let {
        if (it > 4) {
            list.remove(it)
        } //no else required
    }
}

Run Code Online (Sandbox Code Playgroud)

最后,当操作是分支内部when的赋值时else也不需要

fun `modify element inside let and when`(random: Int) {
    list[random]?.let {
        when {
            it > 4 -> list[random] = 10
            //no else branch required
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它使用 kotlin 1.3.72 版进行了测试。

al3*_*l3c 5

let 返回一个值,即使你不使用它。

现在默认情况下,kotlin 将最后一条语句作为返回值。因此,when表达式的值用作返回值。而这反过来又迫使它when变得枯燥乏味。

如果您只是尝试将 a 分配when给某个值,您可以观察到相同的行为。

val foo = when {
            it > 4 -> list.remove(it)
            else -> { //else branch required
            }
          }
Run Code Online (Sandbox Code Playgroud)

在你的情况下,因为你不需要结果,你可以使用 also