Kotlin tiene funciones de iteración muy agradables, como forEach
or repeat
, pero no puedo hacer que los operadores break
y continue
funcionen 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@label
ybreak@label
), consulte la pregunta relacionada: stackoverflow.com/questions/34642868/…break
ycontinue
para 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
return
para salir del método (oreturn value
si no es ununit
método).Utilice un método
Cree un método de repetición personalizado que regrese
Boolean
para continuar.fuente
break
ycontinue
solo funciona en bucles.forEach
,repeat
y todos los demás métodos son solo eso: métodos y no bucles. Yoav presentó algunas alternativas, perobreak
ycontinue
no se Ment al trabajo de métodos.continue@label
ybreak@label
), consulte la pregunta relacionada: stackoverflow.com/questions/34642868/…Esto imprimirá 1 a 5. El
return@forEach
actúa como la palabra clavecontinue
en 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
continue
y unbreak
ejemplo: 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
@loop
da el mismo resultado deseado.Puede usar el retorno de la expresión lambda que imita a
continue
obreak
segú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
return
es 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
forEach
continue
tipo de comportamiento enforEach
para el
break
tipo de comportamiento que tiene que usarfor in until
ofor in
según la lista esNullable
oNon-Nullable
Para 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