回答:
いいえ、例外をスローせずに「各」を中止することはできません。特定の条件下でブレークを中止したい場合は、クラシックループが必要になる可能性があります。
または、それぞれの代わりに「検索」クロージャを使用して、ブレークを実行したときにtrueを返すこともできます。
この例は、リスト全体を処理する前に中止されます。
def a = [1, 2, 3, 4, 5, 6, 7]
a.find {
if (it > 5) return true // break
println it // do the stuff that you wanted to before break
return false // keep looping
}
プリント
1
2
3
4
5
6または7は印刷されません。
また、クロージャを受け入れるカスタムのブレーク動作を備えた独自のイテレータメソッドを書くのも非常に簡単です。
List.metaClass.eachUntilGreaterThanFive = { closure ->
for ( value in delegate ) {
if ( value > 5 ) break
closure(value)
}
}
def a = [1, 2, 3, 4, 5, 6, 7]
a.eachUntilGreaterThanFive {
println it
}
また印刷:
1
2
3
4
5
find
よりも良いany
-以下の他の回答を参照してください@Michalからの私のための1つの作品
def test = [2] test.findResult{ it * 2 }
2ではなく4を返します
交換する各でループを任意のクロージャ。
def list = [1, 2, 3, 4, 5]
list.any { element ->
if (element == 2)
return // continue
println element
if (element == 3)
return true // break
}
出力
1
3
any()
この方法での使用は少し誤解を招きますが、確かに機能し、中断または続行することができます。
いいえ、例外をスローせずにGroovyのクロージャーから抜け出すことはできません。また、制御フローに例外を使用しないでください。
自分がクロージャから抜け出したいと思っているのに気づいたら、おそらく最初に、なぜこれを実行したいのかを考え、どのようにそれを実行しないのかを考えるべきです。最初に検討すべきことは、問題のクロージャーをGroovyの(概念的な)高次関数の1つで置き換えることです。次の例:
for ( i in 1..10) { if (i < 5) println i; else return}
なる
(1..10).each{if (it < 5) println it}
なる
(1..10).findAll{it < 5}.each{println it}
これはまた、明快さを助けます。それはあなたのコードの意図をはるかによく述べています。
示されている例の潜在的な欠点は、反復が最初の例の早い段階でしか停止しないことです。パフォーマンスに関する考慮事項がある場合は、その場で停止することができます。
ただし、反復を伴うほとんどのユースケースでは、通常、Groovyのfind、grep、collect、injectなどのメソッドのいずれかに頼ることができます。彼らは通常、いくつかの「構成」を取り、次に反復をどのように行うかを「知っている」ため、可能な限り命令ループを実際に回避することができます。
特別なクロージャーを使うだけ
// declare and implement:
def eachWithBreak = { list, Closure c ->
boolean bBreak = false
list.each() { it ->
if (bBreak) return
bBreak = c(it)
}
}
def list = [1,2,3,4,5,6]
eachWithBreak list, { it ->
if (it > 3) return true // break 'eachWithBreak'
println it
return false // next it
}
(1..10).each {
if(それ<5)
println it
そうしないと
falseを返す
each
、から抜け出すことはなく、単に4より大きい値を出力しません。これelse
は不必要です。コードがなければ、コードは同じように動作します。また、直後と直前に置いeach
ても壊れないことを証明できreturn false
ます。println "not breaking"
else
return false
あなたは壊すことができRETURN
ます。例えば
def a = [1, 2, 3, 4, 5, 6, 7]
def ret = 0
a.each {def n ->
if (n > 5) {
ret = n
return ret
}
}
わたしにはできる!
any
返すと、配列のメソッドを分割できfalse
ます。each
同じ方法でメソッドを壊すことはできません。