Groovy - 如何退出每个循环?
Posted
技术标签:
【中文标题】Groovy - 如何退出每个循环?【英文标题】:Groovy - how to exit each loop? 【发布时间】:2010-12-18 12:36:47 【问题描述】:我是 Grails/Groovy 的新手,正在尝试在 xml 文件中查找节点;我已经想出了如何遍历所有这些,但是我想在找到目标节点时退出循环。我已经读过,而不是使用“每个”,而是使用“查找”,但我看到的查找示例是条件。现在我的逻辑是遍历整个文件而不退出。代码如下:
records.children().each domain ->
println "domain_name: " + domain.@domain_name
if (domain.@domain_name == targetDomain)
println "target domain matched: " + domain.@domain_name
domain.children().each misc_field ->
println "field_name: " + misc_field.@field_name
println "field_type: " + misc_field.@field_type
println "field_value: " + misc_field
【问题讨论】:
【参考方案1】:你不能优雅地做到这一点。您可能会看到有人建议抛出异常,但这只是plain ugly。
这里有一些关于使用each
与for
的mailing list discussion,有几个人说for
是首选,因为each
无法摆脱迭代。
您最好的选择可能是切换到 for
循环并迭代:
for(def domain : records.children()) // this may need some tweaking depending on types
// do stuff
if(condition)
break;
要么,或者像你说的那样,也许使用find 或findAll 来找到你正在寻找的元素(以下代码被解释,我还没有时间测试它):
def result = records.children().find domain -> domain.@domain_name == targetDomain
result.children().each
// print stuff
相关的 SO 问题:
best-pattern-for-simulating-continue-in-groovy-closure is-it-possible-to-break-out-of-closure-in-groovy【讨论】:
但是在杰克原来的问题中,他甚至需要破解吗?在我看来,意图是(在伪常规中,因为我从未使用过它)records.children.find(@domain_name = targetDomain).children().each (println) @neonski - 是的,我只是在编辑我的答案,就像你解释的那样。我认为这可能是更理想的解决方案。 @Jack - 你能澄清哪一个有效吗(为了未来的读者)?如果不是find
解决方案,您也可以尝试一下,只是为了体验。这更像是一个时髦的解决方案。
当然 - 我实际上是在刷新 cmets 之前发布了答案。我使用了第一个解决方案。我尝试了第二个,但编译器在“=”符号处显示“意外令牌”:@domain_name = targetDomain.
+1 在这种情况下使用 Find。它很简洁,我发现使用 Find 或 FindAll 非常方便,并且使代码易于理解和测试。【参考方案2】:
用 any 或 find 闭包替换 each 循环。
def list = [1, 2, 3, 4, 5]
list.any element ->
if (element == 2)
return // continue
println element
if (element == 3)
true // break
输出
1
3
【讨论】:
【参考方案3】:关于打破每个循环,请参阅:is it possible to 'break' out of a groovy closure
基本上你必须抛出异常并捕获它。 “break”关键字只允许在循环中使用,而不是迭代“闭包”(真正的代码块)。
您可以通过“查找”使用任何复杂的代码,只需确保您调用的函数返回一个布尔值。例如:
Boolean test(val)
println "Testing $val"
return val == 1
def found = [3,4,5,1,6,3].find test(it)
println "Found $found"
【讨论】:
【参考方案4】:我认为这也应该有效,在第一场比赛就停止。
def result = records.children().find domain ->
if (domain.@domain_name == targetDomain)
// Do stuff
...
return true
else
return false
【讨论】:
以上是关于Groovy - 如何退出每个循环?的主要内容,如果未能解决你的问题,请参考以下文章