Kotlinの二重ループforeach内にcontinueやbreakがある際の動きについて、理解に苦労しました。
そのため、これらがどのような動きをするのか備忘録として残しておきます。
検証
検証にはKotlin Playgroundを使いました。
continue,breakともに使用しない場合
val nums = listOf(1, 2, 3)
val chars = listOf('a', 'b', 'c')
// 外側のforEachループ
nums.forEach { num ->
println(num)
// 内側のforEachループ
chars.forEach { char ->
println(char)
}
}
結果は下記のようになります。
1
a
b
c
2
a
b
c
3
a
b
c
当然ですが、すべての値が出力されます。
二重ループの内側でcontinueする場合
val nums = listOf(1, 2, 3)
val chars = listOf('a', 'b', 'c')
// 外側のforEachループ
nums.forEach { num ->
println(num)
// 内側のforEachループ
chars.forEach { char ->
if (char == 'b') return@forEach
println(char)
}
}
Kotlinでcontinueを行うには、return@forEach
と記載します。
結果は下記のようになります。
1
a
c
2
a
c
3
a
c
if (char == 'b') return@forEach
で内側のforEachループがcontinue出来ていますね。
二重ループの内側でbreakする場合
val nums = listOf(1, 2, 3)
val chars = listOf('a', 'b', 'c')
// 外側のforEachループ
nums.forEach { num ->
println(num)
// 内側のforEachループ
run loop@{
chars.forEach { char ->
if (char == 'b') return@loop
println(char)
}
}
}
Kotlinでbreakを行うには、まずforEachの前にrun loop@
を追加します。
loop@
はラベルで任意の名前でOKです。これは追加しなくても良いです。
次にbreakしたい箇所にreturn@loop
を追加します。
結果は下記のようになります。
1
a
2
a
3
a
if (char == 'b') return@loop
で内側のforEachループがbreak出来ていますね。
二重ループの外側でcontinueする場合
val nums = listOf(1, 2, 3)
val chars = listOf('a', 'b', 'c')
// 外側のforEachループ
nums.forEach { num ->
if (num == 2) return@forEach
println(num)
// 内側のforEachループ
chars.forEach { char ->
println(char)
}
}
二重ループの内側でcontinueする場合と同じく、return@forEach
と記載します。
結果は下記のようになります。
1
a
b
c
3
a
b
c
if (num == 2) return@forEach
で外側のforEachループがcontinue出来ていますね。
二重ループの外側でbreakする場合
val nums = listOf(1, 2, 3)
val chars = listOf('a', 'b', 'c')
// 外側のforEachループ
run loop@ {
nums.forEach { num ->
if (num == 2) return@loop
println(num)
// 内側のforEachループ
chars.forEach { char ->
println(char)
}
}
}
こちらも二重ループの内側でbreakするのと同じく、forEachの前にrun loop@
、breakしたい箇所にreturn@loop
を追加します。
結果は下記のようになります。
1
a
b
c
if (num == 2) return@loop
で外側のforEachループがbreak出来ていますね。
二重ループの内側から外側のループをbreakする場合
val nums = listOf(1, 2, 3)
val chars = listOf('a', 'b', 'c')
// 外側のforEachループ
run loop@ {
nums.forEach { num ->
println(num)
// 内側のforEachループ
chars.forEach { char ->
if (num == 2) return@loop
println(char)
}
}
}
二重ループの内側から外側のループをbreakで抜ける場合は、内側のループ内にreturn@loop
を追加します。
結果は下記のようになります。
1
a
b
c
2
if (num == 2) return@loop
で外側のforEachループがbreak出来ていますね。
以上、Kotlinの二重ループforeach内のcontinueやbreakの動きについて調べてみた結果でした