news

Sabtu, 13 Juni 2020

Apa itu Vararg Argument di Kotlin?


Vararg Argument

Selain named dan default argument, Kotlin juga memiliki vararg argument. Dengan menggunakan kata kunci varargkita juga bisa menyederhanakan beberapa parameter yang memiliki tipe data yang sama, menjadi parameter tunggal. 

Dengan  vararg, sebuah fungsi dapat memiliki jumlah parameter berdasarkan jumlah argumen yang kita masukan ketika fungsi tersebut dipanggil. Contoh dari penggunaan vararg adalah sebagai berikut:

  1. fun sumNumbers(vararg number: Int): Int {

  2.     return number.sum()

  3. }


Bisa kita perhatikan pada contoh kode di atas bahwa kata kunci vararg ditempatkan sebelum nama parameter. ketika ingin memanggil fungsi tersebut, kita bisa melampirkan beberapa argumen, misal seperti berikut:

  1. fun main() {

  2.     val number = sumNumbers(10, 20, 30, 40)

  3.     print(number)

  4. }

  5.  

  6. fun sumNumbers(vararg number: Int): Int {

  7.     return number.sum()

  8. }

  9.  

  10. /*

  11.    output : 100

  12. */


Selain itu, kita juga bisa menerapkan Generic untuk tipe parameter ketika parameter tersebut ditentukan dengan vararg. Contohnya seperti berikut:

  1. fun <T> asList(vararg input: T): List<T> {

  2.     val result = ArrayList<T>()

  3.     for (item in input)

  4.         result.add(item)

  5.     return result

  6. }


Ketika sebuah parameter ditentukan dengan vararg, pada dasarnya semua argumen yang dilampirkan, ditampung di  dalam sebuah Array <out T>. Contohnya bisa kita lihat pada contoh kode di atas. 
Karena pada dasarnya adalah sebuah Array, maka kita bisa memanggil fungsi atau properti yang tersedia pada kelas Array dari dalam fungsi tersebut. Misal properti size:

  1. fun main() {

  2.     val number = getNumberSize(10, 20, 30, 40, 50)

  3.     print(number)

  4. }

  5.  

  6. fun getNumberSize(vararg number: Int): Int {

  7.     return number.size

  8. }

  9.  

  10. /*

  11.    output : 5

  12. */


Lalu kapan kita membutuhkan vararg?  Ketika sebuah fungsi yang menggunakannya tidak mengetahui jumlah argumen yang akan disematkan ketika fungsi tersebut dipanggil. Contoh penerapan bisa kita liat pada fungsi String.format(),  di mana fungsi tersebut terdapat parameter yang ditandai dengan vararg dan dapat disematkan beberapa argumen tanpa harus tau batasannya.


Aturan pada Vararg Arguments

Dalam penggunaannya, terdapat aturan yang perlu kita ketahui. Pertama, di dalam sebuah fungsi, tidak diizinkan untuk memiliki 2 (dua) parameter bertanda vararg.

  1. fun sumNumbers(vararg number: Int, vararg number2: Int)


Ketika kode di atas dijalankan, proses kompilasi akan gagal dengan log eror sebagai berikut:
Kotlin: Multiple vararg-parameters are prohibited
Selanjutnya, jika kita ingin menambahkan parameter baru tanpa kata kunci vararg, parameter yang ditandai dengan vararg sebaiknya berada pada posisi pertama. Contohnya seperti berikut:

  1. fun sets(vararg number: Int, name: String): Int {

  2.     ...

  3. }


Lalu bagaimana jika kita ingin menempatkan parameter yang ditandai vararg bukan pada posisi pertama? Kita bisa mendifisikannya secara langsung. Namun berbeda saat fungsi tersebut dipanggil di mana kita harus menggunakan named argument saat ingin melampirkan argumen untuk parameter yang tidak ditandai dengan vararg. Contohnya seperti berikut:

  1. fun main() {

  2.     sets(10, 10, name = "Kotlin")

  3. }

  4.  

  5. fun sets(vararg number: Int, name: String): Int {

  6.     ...

  7. }


Kenapa demikian? Saat kita tidak menandai argumen tersebut untuk parameter yang mana, kompiler akan menetapkan jika argumen tersebut untuk parameter yang ditandai dengan vararg.

Vararg vs Array<T>

Karena semua argumen ditampung di dalam sebuah Array, maka akan muncul pertanyaan, "Apa bedanya ketika kita menggunakan Array<T> sebagai tipe parameter?" Misal seperti berikut:

  1. fun sets(number: Array<Int>){

  2.     ...

  3. }


Dari sini kita bisa lihat langsung letak perbedaannya di mana. Ketika fungsi di atas dipanggil, fungsi tersebut membutuhkan argumen berupa nilai yang sudah berbentuk Array seperti berikut:

  1. fun main() {

  2.     val number = arrayOf(10, 20, 30, 40)

  3.     sets(number)

  4. }

  5.  

  6. fun sets(number: Array<Int>) {

  7.     ...

  8. }



Berbeda ketika kita menggunakan vararg. Kita bisa memasukkan argumen satu persatu. Lalu apakah bisa kita memasukkan nilai yang sudah berbentuk Array sebagai argumen untuk parameter yang ditandai dengan vararg?
Tentu bisa! Dengan memanfaatkan spread operator (*) seperti berikut:

  1. fun main() {

  2.     val number = intArrayOf(10, 20, 30, 40)

  3.     sets(10, 20, 20, *number , 10)

  4. }

  5.  

  6. fun sets(vararg number: Int): Int {

  7.     ...

  8. }


Dalam penggunaanya, spread operator ditempatkan sebelum nama variabel yang ingin dilampirkan