Kotlin tiene funciones de iteración muy agradables, como forEachor repeat, pero no puedo hacer que los operadores breaky continuefuncionen con ellos (tanto locales como no locales):
repeat(5) {
    break
}
(1..5).forEach {
    continue@forEach
}El objetivo es imitar los bucles habituales con la sintaxis funcional lo más cerca posible. Definitivamente era posible en algunas versiones anteriores de Kotlin, pero me cuesta reproducir la sintaxis.
El problema puede ser un error con las etiquetas (M12), pero creo que el primer ejemplo debería funcionar de todos modos.
Me parece que he leído en algún lugar sobre un truco / anotación especial, pero no pude encontrar ninguna referencia sobre el tema. Podría tener el siguiente aspecto:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
    for (index in 0..times - 1) {
        body(index)
    }
}
continue@labelybreak@label), consulte la pregunta relacionada: stackoverflow.com/questions/34642868/…breakycontinuepara bucles funcionales, o si está buscando respuestas alternativas que hagan exactamente lo mismo. El primero parece ser el caso, porque rechazó el segundo.Respuestas:
Editar :
De acuerdo con la documentación de Kotlin , es posible usar anotaciones.
Respuesta original :
Dado que proporciona a
(Int) -> Unit, no puede separarse de él, ya que el compilador no sabe que se usa en un bucle.Tienes pocas opciones:
Use un bucle for regular:
Si el bucle es el último código del método
que puede utilizar
returnpara salir del método (oreturn valuesi no es ununitmétodo).Utilice un método
Cree un método de repetición personalizado que regrese
Booleanpara continuar.fuente
breakycontinuesolo funciona en bucles.forEach,repeaty todos los demás métodos son solo eso: métodos y no bucles. Yoav presentó algunas alternativas, perobreakycontinueno se Ment al trabajo de métodos.continue@labelybreak@label), consulte la pregunta relacionada: stackoverflow.com/questions/34642868/…Esto imprimirá 1 a 5. El
return@forEachactúa como la palabra clavecontinueen Java, lo que significa que en este caso, aún ejecuta cada ciclo pero salta a la siguiente iteración si el valor es mayor que 5.Esto imprimirá del 1 al 10 pero salta el 5.
Pruébelos en Kotlin Playground .
fuente
continuey unbreakejemplo: pl.kotl.in/_LAvET-wXSe puede lograr un descanso usando:
Y se puede continuar con:
Como cualquiera aquí recomienda ... lea los documentos: P https://kotlinlang.org/docs/reference/returns.html#return-at-labels
fuente
@loopda el mismo resultado deseado.Puede usar el retorno de la expresión lambda que imita a
continueobreaksegún su uso.Esto se trata en la pregunta relacionada: ¿Cómo hago un "descanso" o "continúo" cuando estoy en un bucle funcional dentro de Kotlin?
fuente
Como dice la documentación de Kotlin , usar
returnes el camino a seguir. Lo bueno de kotlin es que si tiene funciones anidadas, puede usar etiquetas para escribir explícitamente de dónde proviene su devolución:Retorno del alcance de la función
y Local Return (no deja de pasar forEach = continuación)
Mira la documentación, es realmente buena :)
fuente
forEachcontinuetipo de comportamiento enforEachpara el
breaktipo de comportamiento que tiene que usarfor in untilofor insegún la lista esNullableoNon-NullablePara la lista que admite valores NULL :
Para la lista no anulable :
fuente
Sentencia de ruptura para bucles anidados para cada ():
Resultado:
Continuar declaración con función anónima:
Resultado:
fuente
tal vez cambie para cada uno
funciona para hashmaps
fuente