如何使用Kotlin在`while`循环内的`when`语句中`continue`或`break`

Bri*_*ith 7 kotlin

我正在将一个大型项目转换为Kotlin.有许多挑战.我学习Kotlin的新模式就是其中之一.希望我可以使用一种模式来解决这个问题.

这是我试图实现的代码.但是,continue并且breakwhen声明中无效.

while (!mStopped && c.moveToNext()) {

    val itemType = c.getInt()
    when (itemType) {
        1, 2 -> {
            doSomething()
            if (condition)
                continue
            doSomethingElse()
        }
    }
    doTheLastStuff()
}
Run Code Online (Sandbox Code Playgroud)

这是代码的一个非常简化的版本.原始的Java代码有switch语句中的行100的,和很多continue的和break的.

我想要实现的是继续执行while声明.在Kotlin这样做的模式是什么?

mie*_*sol 7

您可以使用标签继续/打破循环,即:

myLoop@ while (!mStopped && c.hasNext()) {

    val itemType = c.next()
    when (itemType) {
        1, 2 -> {
            doSomething()
            if (condition())
                continue@myLoop
            doSomethingElse()
        }
    }
    doTheLastStuff()
}
Run Code Online (Sandbox Code Playgroud)

以下是文档的相关摘录:

Kotlin中的任何表达都可以用标签标记.标签的形式为标识符,后跟@符号,例如:abc @,fooBar @是有效标签(...)使用标签限定的中断在标有该标签的循环后立即跳转到执行点.继续进行到该循环的下一次迭代.


vod*_*dan 6

这里的问题是,breakcontinue有一个内部的特殊含义when的语句,即突破和持续的when本身,而不是周围的循环.目前(kotlin 1.0)语法尚未确定,因此尽管保留了关键字,但该功能仍无效.

要解决此问题,请使用标签https://kotlinlang.org/docs/reference/returns.html#break-and-continue-labels:

loop@ while (...) {
    when (itemType) {
        1 -> continue@loop
        else -> break@loop
    }
}
Run Code Online (Sandbox Code Playgroud)