Groovy - 如何退出每个循环?

时间:2009-11-19 22:10:07

标签: 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

    }



   }
  }

4 个答案:

答案 0 :(得分:41)

你不能优雅地做到这一点。您可能会看到有人建议抛出异常,但那只是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;
    }
}

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

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

相关的SO问题:

答案 1 :(得分:5)

每个循环替换为任何查找关闭。

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

    println element

    if (element == 3)
        true // break
}

输出

1
3

答案 2 :(得分:4)

关于打破每个循环,请参阅:is it possible to 'break' out of a groovy closure

基本上你必须抛出异常并抓住它。 “break”关键字只允许在循环内部而不是迭代“闭包”(真正的代码块)。

您可以将任何复杂的代码与“find”一起使用,只需确保您调用的函数返回一个布尔值。例如:

Boolean test(val) {
    println "Testing $val"
    return val == 1
}

def found = [3,4,5,1,6,3].find { test(it) }

println "Found $found"

答案 3 :(得分:2)

我认为这也应该有效,在第一场比赛中停止。

def result = records.children().find { domain -> 
    if (domain.@domain_name == targetDomain) {
        // Do stuff
        ...
        return true
    } else {
        return false
    }
}