peliculas - groovy traduccion
¿Puedes salir de un cierre Groovy "cada"? (6)
(1..10) .each {
si (es <5)
imprimirlo
más
falso retorno
¿Es posible break
un Groovy .each{Closure}
, o debería usar un loop clásico en su lugar?
No, no puedes abortar un "cada" sin lanzar una excepción. Es probable que desee un bucle clásico si desea que la interrupción aborte en una condición particular.
Alternativamente, podría usar un cierre de "búsqueda" en lugar de uno para cada uno y devolver verdadero cuando hubiera hecho un descanso.
Este ejemplo se cancelará antes de procesar toda la lista:
def a = [1, 2, 3, 4, 5, 6, 7]
a.find {
if (it > 5) return true // break
println it // do the stuff that you wanted to before break
return false // keep looping
}
Huellas dactilares
1
2
3
4
5
pero no imprime 6 o 7.
También es muy fácil escribir sus propios métodos de iterador con comportamientos de interrupción personalizados que aceptan cierres:
List.metaClass.eachUntilGreaterThanFive = { closure ->
for ( value in delegate ) {
if ( value > 5 ) break
closure(value)
}
}
def a = [1, 2, 3, 4, 5, 6, 7]
a.eachUntilGreaterThanFive {
println it
}
También imprime:
1
2
3
4
5
No, no puedes salir de un cierre en Groovy sin lanzar una excepción. Además, no debe usar excepciones para el flujo de control.
Si desea salir de un cierre, probablemente debería pensar primero en por qué quiere hacer esto y no cómo hacerlo. Lo primero a considerar podría ser la sustitución del cierre en cuestión por una de las funciones de orden superior (conceptuales) de Groovy. El siguiente ejemplo:
for ( i in 1..10) { if (i < 5) println i; else return}
se convierte
(1..10).each{if (it < 5) println it}
se convierte
(1..10).findAll{it < 5}.each{println it}
que también ayuda a la claridad. Establece la intención de tu código mucho mejor.
El posible inconveniente en los ejemplos que se muestran es que la iteración solo se detiene antes en el primer ejemplo. Si tiene consideraciones de rendimiento, puede detenerlo en ese mismo momento.
Sin embargo, para la mayoría de los casos de uso que involucran iteraciones, generalmente puede recurrir a uno de los métodos de búsqueda, grep, recopilación, inyección, etc. de Groovy. Por lo general, toman algunas "configuraciones" y luego "saben" cómo realizar la iteración por usted, de modo que usted puede evitar bucles imperativos siempre que sea posible.
Podrías romper con RETURN
. Por ejemplo
def a = [1, 2, 3, 4, 5, 6, 7]
def ret = 0
a.each {def n ->
if (n > 5) {
ret = n
return ret
}
}
¡Esto funciona para mi!
Reemplace cada lazo con cualquier cierre.
def list = [1, 2, 3, 4, 5]
list.any { element ->
if (element == 2)
return // continue
println element
if (element == 3)
return true // break
}
Salida
1
3
Solo usando un cierre especial
// declare and implement:
def eachWithBreak = { list, Closure c ->
boolean bBreak = false
list.each() { it ->
if (bBreak) return
bBreak = c(it)
}
}
def list = [1,2,3,4,5,6]
eachWithBreak list, { it ->
if (it > 3) return true // break ''eachWithBreak''
println it
return false // next it
}