empty eachwithindex collection groovy

eachwithindex - groovy map collect



DeclaraciĆ³n maravilloso de EachWithIndex (4)

Estos son métodos simples, pero siguen un patrón bastante específico: toman un Closure como su último argumento. Un Cierre es una funcionalidad que puede pasar y llamar cuando corresponda.

Por ejemplo, el método eachWithIndex podría verse así (más o menos):

void eachWithIndex(Closure operation) { for (int i = 0; this.hasNext(); i++) { operation(this.next(), i); // Here closure passed as parameter is being called } }

Este enfoque permite construir algoritmos genéricos (como iteración sobre elementos) y cambiar la lógica de procesamiento concreta en tiempo de ejecución pasando diferentes cierres.

En cuanto a la parte de los parámetros, como ve en el ejemplo anterior, llamamos al cierre ( operation ) con dos parámetros: el elemento actual y el índice actual. Esto significa que el método eachWithIndex espera recibir no solo un cierre sino uno que acepte estos dos parámetros. Desde una sintaxis prospectiva uno define los parámetros durante la definición de cierre de esta manera:

{ elem, index -> // logic }

Entonces -> se usa para separar argumentos de la definición de cierre de su lógica. Cuando un cierre toma solo un argumento, su definición de parámetro puede ser omitida y luego el parámetro será accesible dentro del alcance del cierre con el nombre (nombre implícito del primer argumento). Por ejemplo:

[1,2,3].each { println it }

Podría ser reescrito así:

[1,2,3].each({ elem -> println elem })

Como puede ver, el lenguaje Groovy agrega algo de azúcar sintáctica para que las construcciones parezcan más bonitas.

Soy nuevo en Groovy y he tenido problemas para entender las declaraciones de each{} y eachwithindex{} en groovy.

¿ each y eachWithIndex realmente métodos? Si es así, ¿cuáles son los argumentos que toman?

En la documentación maravillosa hay este cierto ejemplo:

def numbers = [ 5, 7, 9, 12 ] numbers.eachWithIndex{ num, idx -> println "$idx: $num" } //prints each index and number

Bueno, veo que los numbers son una matriz. ¿Qué son num e idx en la declaración anterior? ¿Qué hace el operador -> ?

Sé que $idx y $num imprime el valor, pero ¿cómo es que idx y num se asocian automáticamente con el índice y el contenido de la matriz? ¿Cuál es la lógica detrás de esto? Por favor ayuda.


Normalmente, si está utilizando un lenguaje de programación funcional como Groovy, le conviene evitar el uso de each y eachWithIndex ya que lo alientan a modificar el estado dentro del cierre o hacer cosas que tienen efectos secundarios.

Si es posible, puede realizar sus operaciones utilizando otros métodos de recolección maravillosos como .collect o .inject o findResult etc.

Sin embargo, para usarlos para su problema, es decir, imprima los elementos de la lista con su índice, necesitará usar el método withIndex en la colección original que transformará la colección en una colección de pares de [elemento, índice]

Por ejemplo,

println([''a'', ''b'', ''c''].withIndex())


EachWithIndex se puede usar de la siguiente manera:

package json import groovy.json.* import com.eviware.soapui.support.XmlHolder def project = testRunner.testCase.testSuite.project def testCase = testRunner.testCase; def strArray = new String[200] //Response for a step you want the json from def response = context.expand(''${Offers#Response#$[/'Data/']}'').toString() def json = new JsonSlurper().parseText(response) //Value you want to compare with in your array def offername = project.getPropertyValue("Offername") log.info(offername) Boolean flagpresent = false Boolean flagnotpresent = false strArray = json.Name def id = 0; //To find the offername in the array of offers displayed strArray.eachWithIndex { name, index -> if("${name}" != offername) { flagnotpresent= false; } else { id = "${index}"; flagpresent = true; log.info("${index}.${name}") log.info(id) } }


each y eachWithIndex son, entre muchos otros, los que toman el llamado Closure como argumento. El cierre es solo una pieza de código Groovy envuelto en {} llaves. En el código con matriz:

def numbers = [ 5, 7, 9, 12 ] numbers.eachWithIndex{ num, idx -> println "$idx: $num" }

solo hay un argumento (cierre, o más precisamente: función), tenga en cuenta que en Groovy () llaves son a veces opcionales. num e idx son solo alias opcionales para los argumentos de cierre (función), cuando necesitamos solo un argumento, esto es equivalente (es un nombre implícito del primer argumento de cierre, muy conveniente):

def numbers = [ 5, 7, 9, 12 ] numbers.each {println "$it" }

Referencias