2016-04-07 3 views
9

В рамках начинающего Groovy семинар, Мы Перебор следующего списка (fromJson.secrets):Groovy .each против .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]] 

Первоначальный план был использовать .collect, однако похоже, что использование .each произвело те же результаты (итерации по списку ...).

Вопросы есть, кто-то может помочь мне понять разницу между методами в отношении моего случая использования и в целом

каждый:

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


сбор:

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

ответ

19

each возвращает вход each. Ваш код там управляет it.street на месте. Таким образом, вы возвращаете свой первоначальный список, где каждый street получил вспять. С помощью collect вы создаете новый список с управляемыми элементами. Таким образом, кажущийся результат тот же, но разница в том, что вы создали новый контейнер, но все же ваш оригинал был подделан. Простое эмпирическое правило: each используется для побочных эффектов (что является вашим примером). В то время как collect используется для создания чего-то нового (например, map)

+3

И вторая строка в каждой из них не нужна, так как возвращаемое значение для каждого закрытия не принимается к учетной записи в любом случае – Vampire

+0

@cfrick спасибо за ответ! Таким образом, невозможно было бы вызывать последовательность по неизменяемой последовательности. Правильно? – Vano

+2

@Vano уверен, что вы можете. но если это действительно неумолимо, вы не сможете вытащить это 'it.x = somethingnew'. но вполне нормально выполнять 'immutableList.each {println it}', например. – cfrick

Смежные вопросы