Когда использовать `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, но не наоборот, правильно?

1458   3  

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 и другие методы. For vs each - это несколько ложная дихотомия.)

Comments

    Ничего не найдено.