The *
Operator dikenal sebagai operator Penyebaran di Kotlin.
Dari Referensi Kotlin ...
Ketika kita memanggil sebuah vararg-function, kita bisa mengirimkan argumen satu per satu, misalnya asList (1, 2, 3), atau, jika kita sudah memiliki sebuah array dan ingin meneruskan isinya ke fungsi tersebut, kita menggunakan spread operator (awali array dengan *):
Ini dapat diterapkan ke Array sebelum meneruskannya ke fungsi yang menerima varargs
.
Sebagai contoh...
Jika Anda memiliki fungsi yang menerima sejumlah argumen yang bervariasi ...
fun sumOfNumbers(vararg numbers: Int): Int {
return numbers.sum()
}
Anda dapat memasukkan array ke dalamnya seperti ...
val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum)
Catatan:
- The
*
Operator juga merupakan operator perkalian (tentu saja).
- Operator hanya bisa digunakan saat meneruskan argumen ke suatu fungsi. Hasil operasi tidak dapat disimpan karena tidak menghasilkan nilai (ini murni gula sintaksis).
- Operator mungkin membingungkan beberapa programmer C / C ++ pada awalnya karena sepertinya pointer sedang de-referensi. Ini tidak; Kotlin tidak memiliki gagasan tentang pointer .
- Operator bisa digunakan di antara argumen lain saat memanggil fungsi vararg. Ini ditunjukkan dalam contoh di sini .
- Fungsi operator mirip dengan
apply
berbagai bahasa pemrograman fungsional.
Selain jawaban yang langsung mengarah ke "apa ini!?!", Anda sering memiliki kasus di mana Anda memiliki
List
dan ingin meneruskannya ke fungsi yang mengharapkan avararg
. Untuk ini, konversinya adalah:Dengan asumsi bahwa parameter terakhir dari
someFunc
adalahvararg
jenis yang sama dengan elemen dalam daftar.sumber
Seperti yang dijelaskan dalam dokumentasi, ini adalah operator penyebaran:
sumber
Jika fungsi yang menerima parameter vararg (Jumlah argumen variabel) seperti:
fun sum(vararg data:Int) { // function body here }
Sekarang untuk memanggil metode ini, kita bisa melakukan:
sum(1,2,3,4,5)
Tetapi bagaimana jika kita memiliki nilai ini dalam sebuah array, seperti:
val array= intArrayOf(1,2,3,4,5)
maka untuk memanggil metode ini kita harus menggunakan operator spread, seperti:
Di sini, * (operator penyebaran) akan meneruskan semua konten dari array itu.
Tapi tunggu sebentar, bagaimana jika kita menyebutnya seperti ini:
sum(array)
itu akan memberi kita kesalahan waktu kompilasi Type Mismatch:Masalahnya adalah
sum
fungsi menerimavararg Int
parameter (yang menerima nilai seperti: 1,2,3,4,5) dan jika kita melewatkan array, itu akan dilewatkan sebagaiIntArray
.sumber
Di Java, Anda dapat meneruskan array sebagaimana adanya, tetapi keuntungan dari membongkar array dengan operator spread
*
adalah operator spread memungkinkan Anda menggabungkan nilai dari array dan beberapa nilai tetap dalam satu panggilan. Java tidak mendukung ini.sumber
val resultOne = arrayOf(intArrayOne, intArrayTwo)
danval resultTwo = arrayOf(*intArrayOne, *intArrayTwo)
. JenisresultOne
danresultTwo
masing-masing adalahArray<Int>
danArray<Array<Int>>
. Saya percaya itulah salah satu alasannya