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"
我认为你正在处理错误的抽象层次.该.each
块完全符合它所说的:它为每个元素执行一次闭包.你可能想要的是用来List.indexOf
找到正确的specificElement
,然后做你需要做的工作.
归档时间: |
|
查看次数: |
27458 次 |
最近记录: |