Pada loop bersarang, break dan continue biasa hanya memengaruhi loop terdalam. Kotlin menyediakan label (penanda nama diikuti @) yang membuat break dan continue dapat menargetkan loop luar secara langsung. Sintaks break@label menghentikan loop yang ditandai label tersebut, sementara continue@label melanjutkan ke iterasi berikutnya dari loop berlabel. Pada chapter ini kita akan memakai labeled break untuk menghentikan pencarian nested, dan labeled continue untuk melewatkan iterasi loop luar.

Sintaks Label #

Label dideklarasikan dengan nama@ sebelum for atau while, lalu dirujuk dengan break@nama atau continue@nama. Nama label bebas, namun konvensi umum memakai nama deskriptif seperti luar@, cari@, atau loopLuar@.

kotlin
fun main() {
    // Labeled break: keluar dari loop terluar
    println("Labeled break (keluar dari loop luar):")
    loopLuar@ for (i in 1..3) {
        for (j in 1..3) {
            if (i == 2 && j == 2) {
                println("  break@loopLuar pada i=$i, j=$j")
                break@loopLuar
            }
            print("  i=$i,j=$j")
        }
        println()
    }
    println("Setelah loop luar")

    // Labeled continue: lompat ke iterasi berikutnya loop luar
    println("Labeled continue (lewati sisa j saat kondisi terpenuhi):")
    forLuar@ for (i in 1..3) {
        for (j in 1..3) {
            if (j == 2) {
                println("  continue@forLuar pada i=$i, j=$j")
                continue@forLuar
            }
            print("  i=$i,j=$j")
        }
        println()
    }

    // Mencari pasangan bilangan yang berjumlah 10
    println("Mencari pasangan dengan jumlah 10:")
    val daftar = listOf(2, 5, 3, 8, 7, 1)
    cari@ for (i in daftar.indices) {
        for (j in i + 1 until daftar.size) {
            if (daftar[i] + daftar[j] == 10) {
                println("  Ditemukan: ${daftar[i]} + ${daftar[j]} = 10 (indeks $i, $j)")
                break@cari
            }
        }
    }

    // Label pada while loop
    println("Label pada while (berhenti ketika total > 100):")
    var a = 0
    luarWhile@ while (a < 50) {
        var b = 0
        while (b < 20) {
            val total = a + b
            if (total > 25) {
                println("  break@luarWhile saat a=$a, b=$b, total=$total")
                break@luarWhile
            }
            b++
        }
        a += 10
    }
}

Output yang Dihasilkan:

text
Labeled break (keluar dari loop luar):
  i=1,j=1  i=1,j=2  i=1,j=3
  i=2,j=1  break@loopLuar pada i=2, j=2
Setelah loop luar
Labeled continue (lewati sisa j saat kondisi terpenuhi):
  i=1,j=1  continue@forLuar pada i=1, j=2
  i=2,j=1  continue@forLuar pada i=2, j=2
  i=3,j=1  continue@forLuar pada i=3, j=2
Mencari pasangan dengan jumlah 10:
  Ditemukan: 2 + 8 = 10 (indeks 0, 3)
Label pada while (berhenti ketika total > 100):
  break@luarWhile saat a=10, b=16, total=26

Mari kita bedah setiap bagian penting:

  1. loopLau@ for (...) { for (...) { break@loopLau } }: ketika kondisi i == 2 && j == 2 terpenuhi, break@loopLau keluar dari loop luar, bukan hanya loop dalam. Loop dalam berhenti di tengah iterasi i=2, j=2, dan loop luar juga berhenti — iterasi i=3 tidak dijalankan.
  2. forLuar@ for (...) { for (...) { continue@forLuar } }: ketika j == 2, continue@forLuar melompat ke iterasi berikutnya loop luar, melewati sisa body loop dalam dan iterasi j=3. Untuk setiap i, hanya j=1 yang dicetak.
  3. Pencarian pasangan dengan break@cari: loop dalam mencari j sehingga daftar[i] + daftar[j] == 10. Begitu ditemukan, break@cari menghentikan kedua loop sekaligus. Tanpa label, break hanya akan keluar dari loop dalam dan pencarian tidak akan berhenti sepenuhnya.
  4. Label pada while: label dapat dipasang pada while maupun do-while. Pada contoh, break@luarWhile menghentikan loop luar begitu total > 25, tanpa harus membiarkan loop dalam menyelesaikan iterasi.

break@label vs break Biasa #

SintaksLoop yang dihentikan
breakLoop terdalam saja
break@labelLoop yang ditandai label@
continueIterasi loop terdalam
continue@labelIterasi loop yang ditandai label@

Pola Umum Pencarian Nested #

Pencarian pasangan pada dua dimensi adalah penerapan klasik labeled break. Tanpa label, kita memerlukan flag boolean untuk keluar dari loop luar secara manual — kode menjadi lebih panjang dan kurang jelas. Dengan break@cari, satu baris saja sudah cukup.

Labeled continue untuk Pengelompokan #

Labeled continue berguna ketika kita ingin melewatkan iterasi loop luar berdasarkan kondisi di loop dalam. Tanpa label, kita harus memeriksa kondisi tersebut di loop luar atau memakai flag.

Label pada while dan do-while #

Label tidak hanya untuk for. while dan do-while juga dapat diberi label. Hal ini berguna untuk loop numerik bersarang yang tidak iterasi atas koleksi tetapi bergantung pada counter manual.

Referensi Lanjutan #

Setelah memahami labeled break/continue, chapter berikutnya akan membahas nested loops itu sendiri — pola umum dan pertimbangan performa saat bekerja dengan loop bersarang.