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@.
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:
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=26Mari kita bedah setiap bagian penting:
loopLau@ for (...) { for (...) { break@loopLau } }: ketika kondisii == 2 && j == 2terpenuhi,break@loopLaukeluar dari loop luar, bukan hanya loop dalam. Loop dalam berhenti di tengah iterasii=2, j=2, dan loop luar juga berhenti — iterasii=3tidak dijalankan.forLuar@ for (...) { for (...) { continue@forLuar } }: ketikaj == 2,continue@forLuarmelompat ke iterasi berikutnya loop luar, melewati sisa body loop dalam dan iterasij=3. Untuk setiapi, hanyaj=1yang dicetak.- Pencarian pasangan dengan
break@cari: loop dalam mencarijsehinggadaftar[i] + daftar[j] == 10. Begitu ditemukan,break@carimenghentikan kedua loop sekaligus. Tanpa label,breakhanya akan keluar dari loop dalam dan pencarian tidak akan berhenti sepenuhnya. - Label pada
while: label dapat dipasang padawhilemaupundo-while. Pada contoh,break@luarWhilemenghentikan loop luar begitutotal > 25, tanpa harus membiarkan loop dalam menyelesaikan iterasi.
break@label vs break Biasa #
| Sintaks | Loop yang dihentikan |
|---|---|
break | Loop terdalam saja |
break@label | Loop yang ditandai label@ |
continue | Iterasi loop terdalam |
continue@label | Iterasi 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 #
- Returns and jumps
— bagian label
@untukbreakdancontinuepada panduan resmi
Setelah memahami labeled break/continue, chapter berikutnya akan membahas nested loops itu sendiri — pola umum dan pertimbangan performa saat bekerja dengan loop bersarang.