tutorial traduccion peliculas descargar app groovy

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 }