web-dev-qa-db-ja.com

Groovy-各ループを終了する方法は?

私は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

    }



   }
  }
24
Jack BeNimble

上品には出来ません。例外をスローするよう提案する人もいるかもしれませんが、それは プレーンな醜い です。

eachforの使用に関する メーリングリストのディスカッション をいくつか紹介します。また、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質問:

42
Rob Hruska

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
5

各ループから抜け出すことについては、以下を参照してください。 グルーヴィーなクロージャーから「抜け出す」ことは可能ですか

基本的には、例外をスローしてキャッチする必要があります。 「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
Alex Stoddard

これもうまくいくと思います。最初の試合で止まります。

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