2011-04-08 14 views
22

Soy nuevo en Groovy y que he tenido que hacer frente algunos problemas para comprender las each{} y eachwithindex{} declaraciones en maravilloso.EachWithIndex comunicado maravilloso

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

En la documentación maravilloso hay esta cierta ejemplo:

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

Bueno, veo que numbers es una matriz. ¿Cuáles son num y idx en la declaración anterior? ¿Qué hace el operador ->?

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

Respuesta

33

Estos son los métodos de civil pero siguen un patrón específico bastante - 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 tener este aspecto (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 a uno construir algoritmos genéricos (como iteración sobre material) y cambiar la lógica de procesamiento de hormigón en tiempo de ejecución mediante el paso diferentes cierres .

En cuanto a la parte de parámetros, como puede ver 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. A partir de una sintaxis prospectivo de un define los parámetros durante la definición del cierre de la siguiente manera:

{ elem, index -> 
    // logic 
} 

Así -> se utiliza para separar los argumentos parte 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 it (nombre implícito para el primer argumento). Por ejemplo:

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

Se podría reescribirse así:

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

Como se ve el lenguaje Groovy añade un poco de azúcar sintaxis para hacer tales construcciones se ven más bonitas.

9

each y eachWithIndex están tomando, entre muchos otros, el llamado Closure como argumento. El cierre es solo una pieza de código Groovy envuelto en llaves {}. En el código de la matriz:

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

sólo hay un argumento (el cierre, o más precisamente: la función), tenga en cuenta que en el maravilloso () los frenos son en algún momento opcional. num y idx son sólo un alias opcionales para cierre de argumentos (función), cuando necesitamos solo un argumento, esto es equivalente (it es el nombre implícito del primer argumento de cierre, muy conveniente):

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

Referencias:

+0

Si num IDX y están siendo considerados como argumentos para el cierre/función, desde donde exactamente están recibiendo los valores dentro de ellos? Quiero decir, ¿cómo está sacando num 5,7,9,12 y cómo está tomando idx 0,1,2,3? –

+0

El método 'eachWithIndex' ejecuta el cierre por cada elemento en la lista, teniendo la plena responsabilidad de los argumentos de cierre. Mire la implementación 'eachWithIndex'. –

0

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

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

Sin embargo, para utilizar estos para su problema, es decir, imprimir los elementos de la lista con su índice, tendrá que utilizar el método withIndex en la colección original que transformará la colección a una colección de pares de [elemento, índice]

Por ejemplo,

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

-1

EachWithIndex se puede utilizar 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) 
    } 

}