如何在Kotlin中使用`when`语句在`while`循环中进行`continue`或`break`操作

8

我正在将一个大型项目转换为Kotlin。这个过程中遇到了许多挑战,其中之一就是学习Kotlin的新模式。希望能找到一种解决这个问题的方法。

以下是我试图实现的代码。但是,在when语句中,continuebreak是无效的。

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

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

这是代码的一个简化版本。原始Java代码在switch语句中有数百行,还有很多continue和break。
我想实现的目标是回到while语句并继续执行。在Kotlin中实现这个模式是什么?

之后,可以尝试将循环转换为尾递归函数,并使用 Kotlin 的 tailrec "注解" 进行优化。 - Jacob Zimmerman
3
好的,我会尽力以通俗易懂的方式翻译以下内容,并保持原意不变。请提供需要翻译的内容: (注意:这不是与其他内容重复。另一个问题是关于功能循环的,而这个问题是关于非功能循环的。我已经请求管理员介入“取消标记为重复项,因为它不是”) - Jayson Minard
2个回答

7
您可以使用标签来中断或继续循环,示例如下:labels
myLoop@ while (!mStopped && c.hasNext()) {

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

以下是有关文档的相关摘录:
任何Kotlin表达式都可以用标签标记。 标签由标识符后跟@符号组成,例如:abc@、fooBar@都是有效的标签(...)带标签的break跳转到标记有该标签的循环之后的执行点。 continue继续进行该循环的下一次迭代。

6
问题在于在when语句内部,breakcontinue具有特殊含义,即跳出和继续执行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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接