Parameter vararg memungkinkan sebuah fungsi menerima jumlah argumen yang tidak tetap, mulai dari nol hingga sebanyak argumen yang dikirim pemanggil. Istilah ini merupakan kependekan dari varargs, yaitu variable number of arguments. Di dalam fungsi, nilai yang masuk diperlakukan sebagai array, sedangkan operator spread menyebarkan isi array yang sudah ada menjadi rangkaian argumen. Topik ini membahas deklarasi vararg, penggunaan operator spread, pencampuran parameter tetap dengan vararg, dan kesalahan yang sering terjadi.
Deklarasi parameter vararg#
Kata kunci vararg ditulis sebelum nama parameter untuk menandai parameter yang dapat menerima argumen sejumlah apa pun. Di dalam fungsi, parameter tersebut berperilaku seperti array sesuai tipe yang ditulis, sehingga vararg angka: Int diperlakukan sebagai IntArray yang dapat diakses per elemen maupun dihitung ukurannya. Fungsi berikut menjumlahkan seluruh argumen yang diterimanya tanpa memandang jumlahnya, ditambah fungsi laporan yang menggabungkan parameter tetap dengan parameter vararg.
fun jumlah(vararg angka: Int): Int {
var total = 0
for (n in angka) {
total += n
}
return total
}
fun laporan(judul: String, vararg nilai: Int) {
var total = 0
for (n in nilai) {
total += n
}
println("$judul: ${nilai.size} nilai, total $total")
}
fun main() {
println(jumlah(10, 20, 30))
println(jumlah(100))
println(jumlah())
val nilai = intArrayOf(24, 12, 8)
println(jumlah(*nilai))
println(jumlah(50, *nilai, 6))
laporan("Ujian Matematika", 80, 90, 100)
}# compiler Kotlin dan pustaka standar yang dipakai jalur ini
export PATH=/home/kal/my-project/tools/kotlinc/bin:/home/kal/my-project/tools/jdk-merged/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
# kompilasi berkas main.kt menjadi out.jar, lalu jalankan programnya
kotlinc main.kt -d out.jar && java -cp "out.jar:$STDLIB" MainKt60
100
0
44
100
Ujian Matematika: 3 nilai, total 270Pemanggilan jumlah(10, 20, 30) mengirim tiga argumen sekaligus, jumlah(100) mengirim satu argumen, sedangkan jumlah() tidak mengirim apa pun sehingga hasilnya 0. Fungsi laporan menunjukkan pencampuran parameter tetap dengan vararg, karena judul wajib diisi lebih dulu dan argumen sisanya masuk ke parameter nilai. Properti nilai.size menyatakan banyaknya argumen yang diterima parameter vararg, yaitu 3 pada pemanggilan di atas, sehingga keluarannya menyebut 3 nilai dengan total 270.
Operator spread#
Argumen untuk parameter vararg tidak harus ditulis satu per satu. Operator spread, yaitu tanda bintang di depan nama array, menyebarkan isi array menjadi rangkaian argumen pada pemanggilan. Spread hanya berlaku pada array, sehingga contoh di sini memakai intArrayOf, yaitu fungsi pustaka standar yang membuat IntArray secara langsung. Dua pemanggilan spread pada program utama diulang pada fragmen berikut beserta hasilnya dalam komentar.
val nilai = intArrayOf(24, 12, 8)
println(jumlah(*nilai)) // 44
println(jumlah(50, *nilai, 6)) // 100Pemanggilan jumlah(*nilai) mengirim 24, 12, dan 8 sebagai tiga argumen terpisah, sehingga hasilnya 44. Pemanggilan jumlah(50, *nilai, 6) mencampur argumen biasa dengan argumen hasil spread, dan urutannya tetap dipertahankan, sehingga totalnya 50 + 24 + 12 + 8 + 6 = 100. Argumen biasa yang mengikuti spread tetap sah karena Kotlin memetakan kembali seluruh rangkaian argumen sesuai posisinya. Apabila datanya berupa List<Int>, konversi dengan toIntArray perlu dilakukan terlebih dahulu sebelum spread dapat dipakai.
Campuran parameter tetap dan vararg#
Parameter vararg tidak harus berada di posisi terakhir. Parameter yang ditulis setelahnya tetap sah, tetapi wajib diisi melalui argumen bernama pada saat pemanggilan karena posisinya tidak lagi dapat dipetakan dari urutan. Bentuk yang paling lazim tetap menempatkan vararg di akhir, sehingga pemanggilannya paling sederhana. Fungsi laporan pada program utama mengikuti bentuk lazim tersebut, dengan judul sebagai parameter tetap di depan dan nilai sebagai parameter vararg di belakangnya.
Kesalahan umum#
Kesalahan yang sering terjadi adalah menerapkan spread pada List. Spread hanya bekerja pada array, sehingga compiler menolak pemanggilan tersebut dengan pesan ketidakcocokan tipe. Berkas berikut sengaja memuat kesalahan tersebut pada fungsi cobaSpread.
fun hitungTotal(vararg angka: Int): Int {
var total = 0
for (n in angka) {
total += n
}
return total
}
fun cobaSpread() {
val angka = listOf(10, 20, 30)
println(hitungTotal(*angka))
}# kompilasi berkas daftar.kt untuk melihat pesan error dari compiler
kotlinc daftar.kt -d daftar.jardaftar.kt:11:26: error: argument type mismatch: actual type is 'List<Int>', but 'IntArray' was expected.
println(hitungTotal(*angka))
^^^^^Pesan error argument type mismatch: actual type is 'List<Int>', but 'IntArray' was expected menyatakan bahwa argumen hasil spread berupa List<Int>, sedangkan parameter vararg menuntut IntArray. Perbaikannya adalah mengonversi List menjadi array terlebih dahulu dengan toIntArray, sehingga pemanggilannya menjadi hitungTotal(*angka.toIntArray()). Cara lainnya adalah menyusun datanya sebagai array sejak awal dengan intArrayOf sebagaimana program utama.
Ringkasan#
- Parameter
varargmenerima jumlah argumen bebas dan berperilaku seperti array di dalam fungsi. - Operator spread menyebarkan isi array menjadi argumen dan boleh dicampur dengan argumen biasa.
- Parameter vararg boleh bukan parameter terakhir, dengan syarat parameter setelahnya diisi secara bernama.
- Spread hanya berlaku pada array, sehingga
Listperlu dikonversi dengantoIntArrayterlebih dahulu.
Referensi#
- Functions — Kotlin Documentation — Deklarasi vararg, operator spread, dan pemanggilan dengan argumen bernama.
- Arrays — Kotlin Documentation — Fungsi intArrayOf dan operasi dasar array pada pustaka standar Kotlin.