如何从一个groovy闭包返回并停止执行?

Cra*_*aig 36 groovy closures return

我想从一个闭包返回,就像在循环中使用break语句一样.

例如:

largeListOfElements.each{ element->
    if(element == specificElement){
        // do some work          
        return // but this will only leave this iteration and start the next 
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的if语句中,我想停止遍历列表并离开闭包以避免不必要的迭代.

我已经看到了一个解决方案,在闭包内抛出一个异常并被抓到外面,但我不太喜欢那个解决方案.

除了更改代码以避免这种算法之外,还有其他解决方案吗?

Ted*_*eid 27

我想你想使用find而不是每个(至少对于指定的例子).闭包不直接支持break.

在封面下,groovy实际上并没有使用闭包来查找,它使用for循环.

或者,你可以编写自己的find/each迭代器的增强版本,它接受一个条件测试闭包,如果找到一个匹配则调用另一个闭包,如果满足匹配就会中断.

这是一个例子:

Object.metaClass.eachBreak = { ifClosure, workClosure ->
    for (Iterator iter = delegate.iterator(); iter.hasNext();) {
        def value = iter.next()
        if (ifClosure.call(value)) {
            workClosure.call(value)
            break
        }        
    }
}

def a = ["foo", "bar", "baz", "qux"]

a.eachBreak( { it.startsWith("b") } ) {
    println "working on $it"
}

// prints "working on bar"


Joh*_*lla 5

我认为你正在处理错误的抽象层次.该.each块完全符合它所说的:它为每个元素执行一次闭包.你可能想要的是用来List.indexOf找到正确的specificElement,然后做你需要做的工作.