我知道我们无法从像.each{}
关闭这样的groovy中的.find{}
闭包中返回。我仍然很好奇为什么下面的代码只执行.find{}
的第一次迭代。
def findlist = [1,2,3,4,5]
def eachlist = [7,6,5]
findlist.find
{
int findelem = it
println "findelem : " + findelem
eachlist.each
{
int eachelem = it
println "eachelem : " + eachelem
if(it == findelem)
{
return true
}
return false
}
}
打印:
findelem : 1
eachelem : 7
eachelem : 6
eachelem : 5
为什么find{}
在第一次迭代后会退出?
PS:我理解这段代码可能没有任何实际意义,只是对常规行为感到好奇。
答案 0 :(得分:3)
因为each
返回未经修改的集合正在迭代。返回的集合的计算结果为true
,因此find
在第一次迭代后停止。
看看下面的代码:
assert [1, 2].each { println it } == [1,2]
assert [1,2].find { println it; [3, 4].each { e -> println e } }
您需要嵌套find
而不是each
。
答案 1 :(得分:2)
只是为了完成Opal的答案(每个都返回集合,如果它不为空,则计算结果为true),你可以在find
闭包内使用局部变量来返回找到的值。稍微简化你的代码:
assert 5 == findlist.find { findelem ->
println "findelem : " + findelem
boolean found
eachlist.each { eachelem ->
println "eachelem : " + eachelem
found = (eachelem == findelem)
}
found
}
然而,有一种更好,更时尚的方式:
assert 5 == findlist.find { it in eachlist }