0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kotlin の forEach の中で continue や break のような動作をさせる方法

Posted at

問題

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?