news

Sabtu, 13 Juni 2020

Belajar Function Type di Kotlin


Function Type

Pada modul sebelumnya, kita sudah mempelajarinya tentang higher-order function, di mana kita bisa melampirkan sebuah fungsi sebagai sebuah argumen. Ketika kita mendeklarasikan sebuah higher-order function, maka kita perlu menentukan tipe deklarasi dari fungsi yang menjadi parameter.

Kotlin sendiri menggunakan function type untuk tipe deklarasi yang berhubungan dengan sebuah fungsi. Dalam penggunaannya, terdapat beberapa tanda yang berhubungan dengan sebuah fungsi seperti jumlah dan tipe parameter serta tipe kembalian.

  1. (Int, Int) -> String


Setiap function type memiliki tanda kurung . Di dalamnya terdapat sebuah parameter dan jumlah tipe yang menandakan jumlah parameter dari fungsi tersebut. Pada contoh di atas, fungsi tersebut memiliki 2 (dua) parameter dengan tipe Int dan memiliki tipe kembalian String. Ketika kita tidak ingin fungsi tersebut mengembalikan nilai, kita bisa menggunakan Unit. Berbeda dengan fungsi pada umumnya, jika menggunakan tipe kembalian Unit, kita wajib menuliskannya.
Ketika kita mempunyai beberapa fungsi yang memiliki function type yang sama, kita bisa menyederhanakannya. Bagaimana caranya? Manfaatkan kata kunci typealias untuk memberikan nama alternatif dari sebuah function type seperti berikut:

  1. typealias Arithmetic = (Int, Int) -> Int

  2.  

  3. val sum: Arithmetic = { valueA, valueB -> valueA + valueB }

  4.  

  5. val multiply: Arithmetic = { valueA, valueB -> valueA * valueB }


typealias cocok digunakan ketika kita mempunyai sebuah function type yang panjang. Dengannya, kita bisa memberikan nama untuk sebuah function type dan menggunakannya sebagai tipe untuk fungsi lainnya.
Untuk membuat instance dari sebuah function type, terdapat beberapa cara. Salah satunya dengan lambda expression yang sudah kita bahas pada modul sebelumnya.
Sedangkan untuk menggunakan instance-nya, kita bisa memanfaatkan operator invoke() seperti berikut:

  1. val sumResult = sum.invoke(10, 10)

  2. val multiplyResult = multiply.invoke(20, 20)


Atau kita bisa menuliskannya secara langsung dengan menghilangkan operator invoke():

  1. val sumResult = sum(10, 10)

  2. val multiplyResult = multiply(20, 20)


Kita juga bisa menandai function type sebagai nullable dengan menempatkannya di dalam tanda kurung dan diakhiri dengan safe call seperti berikut:

  1. typealias Arithmetic = ((Int, Int) -> Int)?

  2. val sum: Arithmetic = { valueA, valueB -> valueA + valueB }


Berikut adalah contoh penggunaan function type yang ditandai sebagai nullable:

  1. sum?.invoke(10, 20)