我是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
}
}
}
答案 0 :(得分:41)
你不能优雅地做到这一点。您可能会看到有人建议抛出异常,但那只是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问题:
答案 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
}
}