从 Kotlin 中的 lambda 返回

Waq*_*nis 0 lambda return kotlin

我是 Kotlin 编程新手,对从 lambda 返回某些内容感到困惑。我想我理解得最多,但下面的代码确实给我带来了问题。

当这样写if(it==0) return@forEach时,应该意味着从 forEach 循环中返回。或者换句话说,退出 forEach 循环。但它仍然继续检查列表中的剩余项目。

这是我正在遵循的代码

fun main(args: Array<String>) {

 val listOf10 = listOf(2, 4, 0, 9, 8)

 listOf10.forEach {
    if (it == 0) return@forEach
    println(it)
 }

}
Run Code Online (Sandbox Code Playgroud)

预期的输出是2,4,但它给出了2,4,9,8。这里有人能帮我解决这个问题吗?

谢谢

Ten*_*r04 5

传递给函数的 lambdaforEach会针对可迭代中的每个项目重复调用,因此如果您提前从 lambda 返回,则只会从 lambda 的迭代调用中返回。

您可以使用作用域函数 lambda 上的标签来中断该函数run,但这很笨拙:

run {
    listOf10.forEach {
        if (it == 0) return@run
        println(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,您对此没有太多需要,因为forEach其目的是附加到函数调用链的末尾。当您只想直接从变量进行迭代时,您应该使用传统的 for 循环。请参阅此处的 Kotlin 编码约定。例如:

for (it in listOf10) {
    if (it == 0) break
    println(it)
}
Run Code Online (Sandbox Code Playgroud)

当您处理一系列函数调用时,您通常使用其他运算符来控制/过滤您想要迭代的内容,并forEach在过滤后在末尾添加一个调用。例如:

listOf10.takeWhile { it != 0 }
    .forEach { println(it) }
Run Code Online (Sandbox Code Playgroud)