Когда использовать `each` и когда использовать цикл ' for` в Groovy
Когда мы используем замыкание each и когда мы используем цикл for в Groovy. Оба эффективно делают одно и то же.
groovy:000> a = [1, 2, 3, 4]
===> [1, 2, 3, 4]
groovy:000> a.each {
groovy:001> println it
groovy:002> }
1
2
3
4
===> [1, 2, 3, 4]
groovy:000> for (it in a) {
groovy:001> println it
groovy:002> }
1
2
3
4
===> null
Закрытие each возвращает список. Так что я, вероятно, могу использовать его вместо цикла for, но не наоборот, правильно?
3 ответов:
forцикл быстрее, чем вы можете в этом вопросе и этом ответе, но помните, что преждевременная оптимизация является корнем всех зол в программировании, поэтому я не могу найти ни одного сценария, который действительно имеет значение.
eachтакже возвращает всю немодифицированную коллекцию, над которой он работал, и Здесь - это конкретный сценарий, который OP счел полезным.forконструкт ничего не возвращает.
Цикл for, вероятно, несколько быстрее и эффективнее памяти, так как каждая конструкция является синтаксическим сахаром. Но я не могу представить себе ситуацию, в которой это действительно имело бы значение.
По моему мнению, единственная существенная разница заключается в том, что вы не можете завершить каждое закрытие без исключения. Вы можете завершить цикл for с перерывом.
Я действительно думаю, что каждая конструкция читается немного более идиоматично.
Обычно предпочтительнее
each, потому что в будущем изменить код будет проще. Методeachотносится к семейству функциональных методов, которые вездесущи в Groovy; напротив, циклforувяз в императивном стиле Java.В качестве начального примера представим, что мы хотим
fooвызватьbarдля каждого элемента:def bar = { println it } def foo = { def a -> a.each { bar it } } foo( [1,2,3,4] )Теперь, что если мы хотим вызвать
barтолько для четных чисел:def bar = { println it } def foo = { def a -> a.findAll{ (it % 2) == 0 }.each{ bar it } } foo( [1,2,3,4] )Что, если мы обнаружим, что
barнуждается индекс списка элемента?Попробуйте записать эти примеры с помощью циклаdef bar = { def item, def index -> println "${index} ${item}" } def foo = { def a -> a.eachWithIndex{ def x, def i -> bar x, i } } foo( [1,2,3,4] )for. Конечно, это можно сделать, но изменения кажутся неэлегантными. (Обратите внимание, как упоминалось в комментариях, вы захотите изучитьcollectи другие методы.Forvseach- это несколько ложная дихотомия.)
Comments