問題
Kotlin の forEach の中で continue や break を使おうとしたら、以下のようなエラーが発生しました。
'break' and 'continue' are only allowed inside a loop
このエラーを解決するにはどうすれば良いか。
解決法
Kotlin では、continue や break といったキーワードは、for や while などの伝統的なループの中でしか使えません。そのため、forEach という関数型のループを使っている場合、エラーが発生します。
forEach の中で continue や break のような動作をさせたい場合は、ラベル付きの return を使うことができます。ラベル付きの return とは、return@ラベル名 という形式で、特定の関数やラムダ式から戻ることを指定するものです。
例えば、以下のコードでは、forEach の中で return@forEach を使って、条件に合致した場合に次の要素に移ることができます。
val nums = listOf(1, 2, 3, 4, 5)
nums.forEach {
if (it % 2 == 0) return@forEach // 偶数ならスキップ
println(it) // 奇数なら出力
}
// 出力
// 1
// 3
// 5
このように、return@forEach は continue のように機能します。同様に、break のようにループを抜けたい場合は、run や run breaking@ { ... } のようにラベル付きの関数を使って囲み、return@breaking を使うことができます。
val nums = listOf(1, 2, 3, 4, 5)
run breaking@ {
nums.forEach {
if (it > 3) return@breaking // 3より大きいならループを抜ける
println(it) // それ以外なら出力
}
}
// 出力
// 1
// 2
// 3
このように、return@breaking は break のように機能します。ただし、この方法は forEach や run のようなインライン関数(inline function)でしか使えません。インライン関数とは、コンパイル時に関数呼び出しの箇所に関数本体のコードが展開されることでパフォーマンスを向上させる仕組みです。
以上が、Kotlin の forEach の中で continue や break のような動作をさせる方法です。
参考
: [Bing AI - Microsoft]
: [Break or Continue a Functional Loop in Kotlin]
: [break
and continue
in forEach
in Kotlin]
: [Returns and jumps - Kotlin Programming Language]
: [Break or Continue a Functional Loop in Kotlin]
: [Returns and jumps - Kotlin Programming Language]
: [Inline functions - Kotlin Programming Language]
: https://www.microsoft.com/en-us/research/project/bing-ai/
: https://www.baeldung.com/kotlin/break-continue-functional-loop
: https://stackoverflow.com/questions/32540947/break-and-continue-in-foreach-in-kotlin
: https://kotlinlang.org/docs/returns.html#return-at-labels
: https://www.baeldung.com/kotlin/break-continue-functional-loop
: https://kotlinlang.org/docs/returns.html#return-at-labels
: https://kotlinlang.org/docs/inline-functions.html