私はGrails/Groovyを初めて使い、xmlファイルでノードを見つけようとしています。私はそれらすべてを反復する方法を理解しましたが、ターゲットノードが見つかったらループを終了します。 「each」を使用する代わりに「find」を使用することを読みましたが、私が見た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
}
}
}
上品には出来ません。例外をスローするよう提案する人もいるかもしれませんが、それは プレーンな醜い です。
each
とfor
の使用に関する メーリングリストのディスカッション をいくつか紹介します。また、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質問:
eachループをanyまたはfindクロージャに置き換えます。
def list = [1, 2, 3, 4, 5]
list.any { element ->
if (element == 2)
return // continue
println element
if (element == 3)
true // break
}
出力
1
3
各ループから抜け出すことについては、以下を参照してください。 グルーヴィーなクロージャーから「抜け出す」ことは可能ですか
基本的には、例外をスローしてキャッチする必要があります。 「break」キーワードは、ループ内でのみ使用でき、「クロージャー」(実際にはコードブロック)を反復しません。
「検索」で複雑なコードを使用できます。呼び出す関数がブール値を返すことを確認してください。例えば:
Boolean test(val) {
println "Testing $val"
return val == 1
}
def found = [3,4,5,1,6,3].find { test(it) }
println "Found $found"
これもうまくいくと思います。最初の試合で止まります。
def result = records.children().find { domain ->
if (domain.@domain_name == targetDomain) {
// Do stuff
...
return true
} else {
return false
}
}