在{}里面找到groovy每个{}

时间:2015-11-27 10:20:27

标签: groovy

我知道我们无法从像.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:我理解这段代码可能没有任何实际意义,只是对常规行为感到好奇。

2 个答案:

答案 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 }