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。

这里有一些关于使用eachfor 的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】:

anyfind 闭包替换 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 - 如何退出每个循环?的主要内容,如果未能解决你的问题,请参考以下文章

jquery的$.each如何退出循环和退出本次循环

在VB中,如何强制退出循环结构

如何退出运行循环?

php 如何退出foreach 循环

退出循环,输入结束后

如何在 Java 中退出 while 循环?