0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kotlin】二重ループforeach内のcontinueやbreakの動きについて調べてみた

Posted at

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の動きについて調べてみた結果でした

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?