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