loops - Kotlin 中 `break` 中的 `continue` 和 `forEach`

标签 loops foreach lambda kotlin

Kotlin 有非常好的迭代函数,例如 forEachrepeat,但我无法使 breakcontinue 运算符(operator)使用它们(本地和非本地):

repeat(5) {
    break
}

(1..5).forEach {
    continue@forEach
}

我们的目标是用尽可能接近的函数语法来模拟通常的循环。在某些旧版本的 Kotlin 中绝对可以,但我很难重现语法。

问题可能是标签 (M12) 的错误,但我认为第一个示例应该可以正常工作。

在我看来,我在某个地方读到了一个特殊的技巧/注释,但我找不到关于这个主题的任何引用资料。可能如下所示:

public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
    for (index in 0..times - 1) {
        body(index)
    }
}

最佳答案

这将打印 1 到 5。return@forEach 的作用类似于 Java 中的关键字 continue,这意味着在这种情况下,它仍然执行每个循环,但会跳到如果值大于 5,则进行下一次迭代。

fun main(args: Array<String>) {
    val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    nums.forEach {
       if (it > 5) return@forEach
       println(it)
    }
}

这将打印 1 到 10,但会跳过 5。

fun main(args: Array<String>) {
    val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    nums.forEach {
       if (it == 5) return@forEach
       println(it)
    }
}

这将打印 1 到 4,并在达到 5 时中断。

fun main(args: Array<String>) {
    val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    
    run breaking@ {
        nums.forEach {
           if (it == 5) return@breaking
           println(it)
        }
    }
}

Link to code snippet from ashuges .

关于loops - Kotlin 中 `break` 中的 `continue` 和 `forEach`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32540947/

相关文章:

c++ - Makefile 中的 foreach 找不到所有文件

python - 使用来自其他 Series/DataFrame 的值(曲线下面积)过滤 DataFrame 中的每个 X

ASP.NET 如何检索页面上的空标签列表?

无法在代码中添加循环

javascript - enquire.js - 如何在动态创建的寄存器函数中维护变量?

c# - 关于使用 Enumerable.Range 与传统 for 循环的 foreach 的思考

c++ - 如何在 lambda 捕获中显式捕获宏?

php - 在 PHP 中循环数组的更好方法是什么?

python - 这两个 python for 循环是一回事吗?

javascript - array.forEach 之后的回调函数