我们何时使用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
循环而不是反过来,对吗?
答案 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
有点是错误的二分法。)