Cómo `continue` o` break` en una instrucción `when` dentro de un ciclo` while` usando Kotlin

Estoy convirtiendo un gran proyecto en Kotlin. Ha habido numerosos desafíos. Yo aprendiendo los nuevos patrones de Kotlin es uno de ellos. Espero que haya un patrón que pueda usar para resolver este.

Aquí está el código que bash lograr. Pero, continue y break no son válidos en una instrucción when .

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

Esta es una versión muy networkingucida del código. El código original de Java tenía cientos de líneas dentro de las instrucciones de conmutación, y muchas de las continue y las break .

Lo que bash lograr es continuar con la ejecución en el while . ¿Cuál es el patrón para hacer esto en Kotlin?

El problema aquí es que break y continue tienen un significado especial dentro de una sentencia when , es decir, quebrar y continuar el propio when , no el ciclo circundante. Por ahora (kotlin 1.0) la syntax aún no está decidida, por lo que la característica no funciona, a pesar de que las palabras key estén reservadas.

Para solucionar esto, use las tags https://kotlinlang.org/docs/reference/returns.html#break-and-continue-labels :

 loop@ while (...) { when (itemType) { 1 -> continue@loop else -> break@loop } } 

Puede usar tags para continuar / romper el ciclo, es decir:

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

Aquí hay un extracto relevante de la documentation:

Cualquier expresión en Kotlin puede estar marcada con una label. Las tags tienen la forma de un identificador seguido del signo @, por ejemplo: abc @, fooBar @ son tags válidas (…) Una interrupción calificada con una label salta al punto de ejecución justo después del bucle marcado con esa label. A continuar avanza a la siguiente iteración de ese ciclo.

  • Cómo verificar la function de kotlin varargs usando mockito
  • Crear una instancia de un oyente de interfaz en Kotlin
  • Prueba JUnit en Kotlin
  • Agregar .putExtra () a un Intento proporciona el código de retorno: -1
  • Proyecto Gradle: java.lang.NoClassDefFoundError: kotlin / jvm / internal / Intrinsics
  • No se pudieron detectar las classs de configuration pnetworkingeterminadas para la class de testing con Kotlin y @AutoConfigureMockMvc
  • Cómo escribir while loop con responseInputStream.read en kotlin android - - while ((i = responseInputStream.read (byteContainer))
  • ¿Puedo tener varios files de salida cuando uso Kotlin JS?
  • Mapa Mutable no anulable
  • RxJava zipCon error IDE en Kotlin con Android Studio 3.0
  • ¿Cómo puedo hacer esta function de una manera funcional de progtwigción?