使用方法によっては、continue
またはbreak
を模倣するreturn from lambda expressionを使用できます。ここで
はcontinue
を模倣する例です。
(1..5).forEach {
if (it == 3) [email protected] // mimic [email protected]
// ... do something more
}
そして、あなたはより複雑行くとあなたが営巣や混乱状況に持ったときにラベルを使用することができます:あなたがしたい場合は
(1..3).forEach [email protected] { x ->
(1..3).forEach [email protected] { y ->
if (x == 2 && y == 2) [email protected] // mimic [email protected]
if (x == 1 && y == 1) [email protected] // mimic [email protected]
// ... do something more
}
}
をbreak
ループの外で返すことができるものが必要な場合は、ここでrun()
関数を使用して:
run [email protected] {
(1..20).forEach { x ->
if (x == 5) [email protected] // mimic [email protected]
// ... do something more
}
}
代わりのrun()
それは当然あなたがから壊したい場所ですforEach
を取り巻くいるlet()
またはapply()
か何かである可能性があります。しかし、forEach
の後に同じブロック内のコードをスキップするので注意してください。
これらはインライン化された関数なので、本当にオーバーヘッドを追加することはありません。
匿名機能を含むすべての特別なケースについては、Returns and JumpsのKotlinリファレンスドキュメントをお読みください。ここで
すべての作品にこれを証明するユニットテスト:ブレークと
@Test fun testSo32540947() {
val results = arrayListOf<Pair<Int,Int>>()
(1..3).forEach [email protected] { x ->
(1..3).forEach [email protected] { y ->
if (x == 2 && y == 2) [email protected] // continue @outer
if (x == 1 && y == 1) [email protected] // continue @inner
results.add(Pair(x,y))
}
}
assertEquals(listOf(Pair(1,2), Pair(1,3), Pair(2,1), Pair(3,1), Pair(3,2), Pair(3,3)), results)
val results2 = arrayListOf<Int>()
run [email protected] {
(1..20).forEach { x ->
if (x == 5) [email protected]
results2.add(x)
}
}
assertEquals(listOf(1,2,3,4), results2)
}
は美しく、別の解決策ではありませんか? – store88