何时使用`each`以及何时在Groovy中使用`for`循环

时间:2014-12-21 03:08:24

标签: loops for-loop groovy closures

我们何时使用each闭包,何时在Groovy中使用for循环。两者都有效地做同样的事情。

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 个答案:

答案 0 :(得分:3)

for循环可能有点快,内存效率更高,因为每个构造都是语法糖。但我无法想象它会真正发挥作用的情况。

根据我的说法,唯一显着的区别是你不能在不抛出异常的情况下终止每个闭包。你可以通过休息终止for循环。

我确实认为每个构造都更加惯用。

答案 1 :(得分:3)

for循环在此question和此answer中更快,但请记住过早优化是编程中所有邪恶的根源所以我找不到任何真正有所作为的情景。

each也会返回它正在运行的整个未经修改的集合,here是OP发现它有用的特定场景。 for构造不会返回任何内容。

答案 2 :(得分:2)

通常Groovier更喜欢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有点是错误的二分法。)