`break` y` continue` en `forEach` en Kotlin

Kotlin tiene funciones de iteración muy agradables, como para forEach o repeat , pero no puedo hacer la break y continue operadores trabajan con ellas (tanto locales como no locales):

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

El objective es imitar los loops habituales con la syntax funcional lo más cerca posible. Definitivamente fue posible en algunas versiones anteriores de Kotlin, pero lucho por reproducir la syntax.

El problema podría ser un error con las tags (M12), pero creo que el primer ejemplo debería funcionar de todos modos.

Me parece que he leído en alguna parte sobre un truco / anotación especial, pero no pude encontrar ninguna reference sobre el tema. Podría verse como el siguiente:

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

    Editar :
    De acuerdo con los documentos antiguos de Kotlin, debería ser posible usar annotations. Sin embargo, aún no está implementado.

    Romper y continuar para las estructuras de control personalizado aún no están implementadas

    El problema para esta funcionalidad es de 3 años, así que supongo que no será reparado.


    Respuesta Original :
    Como usted suministra una (Int) -> Unit , no puede salirse de ella, ya que el comstackdor no sabe que se usa en un bucle.

    Tienes pocas opciones:

    Use un ciclo for para regular

     for (index in 0..times - 1) { // your code here } 

    Si el ciclo es el último código en el método
    puede usar return para salir del método (o return value si no es el método de la unit ).

    Usa un método
    Cree un método de método de repetición personalizado que devuelva Boolean para continuar.

     public inline fun repeatUntil(times: Int, body: (Int) -> Boolean) { for (index in 0..times - 1) { if (!body(index)) break } } 

    Puede usar return de la expresión lambda que imita un continue o break dependiendo de su uso.

    Esto está cubierto en la pregunta relacionada: ¿Cómo hago un "descanso" o "continuar" cuando estoy en un ciclo funcional dentro de Kotlin?

    Esto imprimirá de 1 a 5 y luego dividirá el ciclo foreach. Pruébalo en Kotlin Playground .

     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) } }