Label
Label adalah sebuah penanda yang dapat digunakan untuk memberikan nama pada sebuah expression atau blok kode tertentu.
Label sangat berguna ketika kita ingin mengontrol alur program menggunakan:
breakcontinuereturn
Dengan label, kita dapat menentukan blok kode mana yang ingin dihentikan atau dilanjutkan.
Membuat Label
Sintaks label di Kotlin menggunakan nama label yang diikuti karakter @.
Contoh:
loop@ for (i in 1..10) {
println(i)
}
Pada contoh tersebut:
loop@
adalah label yang diberikan kepada for loop.
Nama label dapat dibuat sesuai kebutuhan.
Contoh:
loopI@
loopJ@
outerLoop@
innerLoop@
Label pada Nested Loop
Label sangat berguna ketika kita memiliki nested loop, yaitu loop di dalam loop.
Contoh:
loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
println("$i x $j = ${i * j}")
}
}
Pada contoh tersebut terdapat dua label:
loopI@
untuk loop bagian luar.
Dan:
loopJ@
untuk loop bagian dalam.
Strukturnya:
loopI@
└── loopJ@
Dengan label tersebut, kita dapat menentukan loop mana yang ingin dihentikan atau dilanjutkan.
Label dengan break
break digunakan untuk menghentikan perulangan.
Tanpa label, break akan menghentikan loop tempat break tersebut berada.
Contoh:
for (i in 1..10) {
for (j in 1..10) {
if (i > 5) {
break
}
println("$i x $j = ${i * j}")
}
}
Pada contoh tersebut, break hanya menghentikan loop bagian dalam.
break dengan Label
Dengan label, kita dapat menentukan loop mana yang ingin dihentikan.
Contoh:
fun labelBreak() {
loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
if (i > 5) {
break@loopI
}
println("$i x $j = ${i * j}")
}
}
}
Perhatikan:
break@loopI
Artinya break akan menghentikan loop yang memiliki label:
loopI@
Bukan hanya loop bagian dalam.
Cara Kerja break@loopI
Pada contoh:
loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
if (i > 5) {
break@loopI
}
println("$i x $j = ${i * j}")
}
}
Ketika:
i > 5
bernilai true, program menjalankan:
break@loopI
Sehingga loop loopI langsung dihentikan.
Dengan kata lain:
loopI@
│
└── loopJ@
│
└── break@loopI
break akan keluar langsung dari loopI.
Contoh Output labelBreak()
fun labelBreak() {
loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
if (i > 5) {
break@loopI
}
println("$i x $j = ${i * j}")
}
}
}
Output:
1 x 1 = 1
1 x 2 = 2
...
5 x 10 = 50
Ketika i menjadi 6, kondisi:
i > 5
terpenuhi sehingga:
break@loopI
menghentikan loop luar.
Label dengan continue
continue digunakan untuk melewati iterasi saat ini dan melanjutkan ke iterasi berikutnya.
Contoh:
fun labelContinue() {
loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
if (j == 5) {
continue@loopI
}
println("$i x $j = ${i * j}")
}
}
}
Perhatikan:
continue@loopI
Artinya program akan melanjutkan ke iterasi berikutnya dari loop yang memiliki label:
loopI@
Perbedaan break dan continue
break:
break@loopI
menghentikan loop yang dituju.
Sedangkan:
continue@loopI
melewati iterasi saat ini dan melanjutkan ke iterasi berikutnya dari loop yang dituju.
Secara sederhana:
break
↓
keluar dari loop
continue
↓
lanjut ke iterasi berikutnya
Cara Kerja continue@loopI
Pada contoh:
loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
if (j == 5) {
continue@loopI
}
println("$i x $j = ${i * j}")
}
}
Ketika:
j == 5
bernilai true, program menjalankan:
continue@loopI
Artinya program tidak melanjutkan loopJ untuk nilai berikutnya.
Program langsung melanjutkan ke iterasi berikutnya pada:
loopI@
Label pada Lambda
Label juga dapat digunakan pada lambda.
Hal ini berguna ketika kita ingin melakukan return dari lambda tertentu.
Contoh:
fun test(
name: String,
operation: (String) -> Unit
): Unit = operation(name)
Function test() menerima:
operation: (String) -> Unit
Artinya operation adalah function yang:
- Menerima satu parameter
String. - Tidak mengembalikan nilai sehingga menggunakan
Unit.
Return pada Lambda
Contoh:
test("") test@{
if (it == "") {
return@test
} else {
println("Ucup")
}
}
Pada contoh tersebut terdapat label:
test@
Label tersebut diberikan pada lambda.
Kemudian:
return@test
digunakan untuk keluar dari lambda tersebut.
Mengapa Menggunakan return@test?
Perhatikan:
test("") test@{
if (it == "") {
return@test
} else {
println("Ucup")
}
}
Jika:
it == ""
bernilai true, maka:
return@test
akan menghentikan eksekusi lambda.
Kode:
println("Ucup")
tidak dijalankan.
Contoh Return to Label
Function:
fun test(
name: String,
operation: (String) -> Unit
): Unit = operation(name)
Kemudian dipanggil:
test("") test@{
if (it == "") {
return@test
} else {
println("Ucup")
}
}
Karena argument yang diberikan adalah:
""
maka kondisi:
it == ""
bernilai true.
Program menjalankan:
return@test
Sehingga lambda langsung selesai.
Return Label dengan Nilai
Label juga dapat digunakan pada lambda yang mengembalikan nilai.
Contoh:
val result = test@{
return@test "Hello"
}
Pada contoh tersebut:
return@test
mengembalikan nilai "Hello" ke lambda yang memiliki label test@.
Contoh Program Lengkap
Berikut contoh penggunaan label dengan break, continue, dan return.
fun labelBreak() {
loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
if (i > 5) {
break@loopI
}
println("$i x $j = ${i * j}")
}
}
}
fun labelContinue() {
loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
if (j == 5) {
continue@loopI
}
println("$i x $j = ${i * j}")
}
}
}
fun test(
name: String,
operation: (String) -> Unit
): Unit = operation(name)
fun main() {
labelBreak()
labelContinue()
test("") test@{
if (it == "") {
return@test
} else {
println("Ucup")
}
}
}
Jenis Penggunaan Label
Label dapat digunakan untuk beberapa kebutuhan.
Label dengan break
break@loopI
Digunakan untuk menghentikan loop yang memiliki label loopI.
Label dengan continue
continue@loopI
Digunakan untuk melanjutkan ke iterasi berikutnya dari loop loopI.
Label dengan return
return@test
Digunakan untuk melakukan return dari scope yang memiliki label test.
Kapan Menggunakan Label?
Label paling sering berguna ketika kita bekerja dengan:
- Nested loop.
breakpada loop bertingkat.continuepada loop bertingkat.- Lambda.
- Higher-Order Function.
- Return dari lambda tertentu.
Contoh yang umum:
outer@ for (i in 1..10) {
inner@ for (j in 1..10) {
if (j == 5) {
break@outer
}
println("$i $j")
}
}
Gunakan Label dengan Bijak
Label memang memberikan kontrol yang lebih fleksibel terhadap alur program, tetapi terlalu banyak menggunakan label dapat membuat kode lebih sulit dibaca.
Contoh:
outer@ for (...) {
middle@ for (...) {
inner@ for (...) {
if (...) {
break@outer
}
}
}
}
Pada nested loop yang sangat kompleks, penggunaan label dapat membuat alur program sulit diikuti.
Karena itu, gunakan label ketika memang membantu membuat kode lebih jelas.
Kesimpulan
Label adalah penanda yang dapat digunakan untuk menentukan target dari break, continue, atau return.
Sintaks dasar label:
namaLabel@
Contoh:
loopI@ for (i in 1..10) {
// ...
}
Untuk break:
break@loopI
Untuk continue:
continue@loopI
Untuk return pada lambda:
test("") test@{
return@test
}
Dengan label, kita dapat menentukan secara spesifik blok kode mana yang ingin dihentikan atau dilanjutkan.
Label memberikan kontrol terhadap alur program, terutama pada nested loop dan lambda. Gunakan label dengan bijak agar kode tetap mudah dibaca dan dipahami.