Groovy - 如何退出每个循环?

Jac*_*ble 25 xml grails groovy

我是Grails/Groovy的新手,我正在尝试在xml文件中找到一个节点; 我已经想出如何迭代所有这些,但我想在找到目标节点时退出循环.我读过它而不是使用"each",使用"find",但我看到的查找示例是条件.现在我的逻辑将迭代整个文件而不退出.代码如下:

  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

    }



   }
  }
Run Code Online (Sandbox Code Playgroud)

Rob*_*ska 43

你不能优雅地做到这一点.您可能会看到有人建议抛出异常,但这只是简单的丑陋.

这里有关于使用vs. 的一些邮件列表讨论,有几个人说这是首选,因为无法从迭代中解脱.eachforforeach

你最好的选择可能是转换到for循环并迭代:

for(def domain : records.children()) { // this may need some tweaking depending on types
    // do stuff
    if(condition) {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,或者像你说的那样,也许使用findfindAll来找到你正在寻找的元素(下面的代码被解释,我还没有时间来测试它):

def result = records.children().find { domain -> domain.@domain_name == targetDomain }
result.children().each {
    // print stuff
}
Run Code Online (Sandbox Code Playgroud)

相关的SO问题:


Mic*_*d a 5

anyfind闭包替换每个循环.

def list = [1, 2, 3, 4, 5]
list.any { element ->
    if (element == 2)
        return // continue

    println element

    if (element == 3)
        true // break
}
Run Code Online (Sandbox Code Playgroud)

产量

1
3
Run Code Online (Sandbox Code Playgroud)