2016-04-07 12 views
9

Come parte di principianti laboratorio Groovy, siamo stati scorrere il seguente elenco (fromJson.secrets):Groovy .each vs .Raccogliere

[[floors:10, street:emaseS, url:http://plywoodpeople.com/wp-content/uploads/2012/03/kermit_the_frog.jpg], [floors:2, street:emaseS, url:http://36.media.tumblr.com/tumblr_lp9bg9Lh2x1r0h9bqo1_500.jpg], [floors:2, street:yawdaorB, url:https://montclairdispatch.com/wp-content/uploads/2013/07/broadway1.jpg], [floors:5, street:emaseS, url:AAA], [floors:2, street:yawdaorB, url:AAA], [floors:6, street:albmaR aL, url:AAA], [floors:1, street:teertS llaW, url:AAA], [floors:6, street:daoR yebbA, url:AAA], [floors:3, street:teertS llaW, url:AAA], [floors:4, street:dlican someone help me to understand the difference between the 2 methods in rehstoR, url:AAA]] 

Il piano originale era quello di utilizzare .Raccogliere, tuttavia sembra che usando .each abbia prodotto gli stessi risultati (iterato sulla lista ...).

La domanda è, qualcuno può aiutarmi a capire la differenza tra i metodi per quanto riguarda il mio caso d'uso e, in generale

ciascuno:

reversed_streets = fromJson.secrets.each { 
    it.street = it.street.reverse() 
    it 
} 


raccogliere:

reversed_streets = fromJson.secrets.collect { 
    it.street = it.street.reverse() 
    it 
} 

risposta

19

each restituisce l'input a each. Il tuo codice manipola lo it.street sul posto. Quindi torni alla lista originale, dove ogni street è stato annullato. Con il collect si crea un nuovo elenco con gli oggetti manipolati. Quindi il risultato apparente è lo stesso, ma la differenza è che hai creato un nuovo contenitore, ma il tuo originale è stato manomesso. Una semplice regola pratica: each viene utilizzato per gli effetti collaterali (che è il tuo esempio). Mentre collect viene utilizzato per creare qualcosa di nuovo (ad esempio map)

+3

E la seconda riga in ciascuna non è necessaria in quanto il valore di ritorno per ogni chiusura non viene preso in considerazione in ogni caso – Vampire

+0

@cfrick grazie per la risposta! Quindi non sarebbe possibile chiamare .each su una sequenza immutabile. Destra? – Vano

+2

@Vano certo che puoi. ma se è davvero immutabile, potresti non essere in grado di tirare quel 'it.x = qualcosa di nuovo'. ma è assolutamente bene fare "immutableList.each {println it}" ad es. – cfrick