2016-04-07 15 views
9

W ramach początkujących warsztat Groovy, byliśmy iteracji na poniższej liście (fromJson.secrets):Groovy .each vs .collect

[[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]] 

Pierwotny plan był do korzystania .collect jednak wygląda na to, że użycie .each dało takie same wyniki (iterowane na liście ...).

pytania jest, może ktoś mi pomóc zrozumieć różnicę między metod w odniesieniu do mojego przypadku użycia iw ogóle

każda:

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


zbierać:

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

Odpowiedz

19

zwraca dane wejściowe do each. Twój kod manipuluje it.street w miejscu. W ten sposób odzyskasz swoją oryginalną listę, gdzie każdy z egzemplarzy został odwrócony. Dzięki collect tworzysz nową listę z manipulowanymi przedmiotami. Tak więc pozorny wynik jest taki sam, ale różnica polega na tym, że utworzyłeś nowy pojemnik, ale mimo to twój oryginał został zmodyfikowany. Prosta zasada: each służy do efektów ubocznych (co jest twoim przykładem). Podczas gdy collect jest używany do tworzenia czegoś nowego (na przykład)

+3

A drugi wiersz w każdym z nich jest niepotrzebny, ponieważ wartość zwracana dla każdego zamknięcia nie jest brana pod uwagę w każdym razie – Vampire

+0

@ Kliknięcie dzięki za odpowiedź! Więc nie byłoby możliwe wywołanie .each nad niezmienną sekwencją. Dobrze? – Vano

+2

@Vano na pewno. ale jeśli jest naprawdę nietrwały, możesz nie być w stanie wyciągnąć tego 'it.x = somethingnew'. ale jest całkiem dobrze zrobić 'immutableList.each {println it}' np. – cfrick