news

Sabtu, 13 Juni 2020

Belajar Lambda with receiver di Kotlin


Lambda with receiver

Setelah mengetahui bagaimana cara mendeklarasikan dan menggunakan lambda, selanjutnya kita akan mempelajari bagaimana lambda dideklarasikan dengan receiver. Konsep ini digunakan sebagai dasar Kotlin untuk digunakan sebagai Domain Specific Languages (DSL).

Apa itu DSL? DSL adalah sebuah bahasa komputer yang dikhususkan untuk domain aplikasi tertentu. Ia berbeda dengan general-purpose language yang bisa diterapkan di semua domain aplikasi. Dengan DSL, kita bisa menuliskan kode lebih ringkas dan ekspresif. Contoh sistem yang menerapkan DSL adalah Gradle dan sistem database yang berbasis SQL.
Pada dasarnya sebuah lambda yang mempunyai receiver mirip seperti extension functions, yang memungkinkan kita untuk mengakses anggota objek receiver dari dalam extension. Pada lambda, receiver ditentukan pada saat menentukan tipe deklarasi. Contohnya seperti di bawah ini:

  1. fun buildString(action: StringBuilder.() -> Unit): String {

  2.     val stringBuilder = StringBuilder()

  3.     stringBuilder.action()

  4.     return stringBuilder.toString()

  5. }


Pada kode di atas, StringBuilder dijadikan sebagai receiver untuk tipe deklarasi parameter action.  Dengan begitu kita dapat memanggil parameter action tersebut dari variabel yang bertipekan StringBuilder. Untuk memanggil fungsi di atas bisa seperti berikut:
  1. fun main() {
  2.     val message = buildString {
  3.         append("Hello ")
  4.         append("from ")
  5.         append("lambda ")
  6.     }
  7.  
  8.     println(message)
  9. }
  10.  
  11. fun buildString(action: StringBuilder.() -> Unit): String {
  12.     val stringBuilder = StringBuilder()
  13.     stringBuilder.action()
  14.     return stringBuilder.toString()
  15. }
  16.  
  17. /*
  18.    output : Hello from lambda
  19. */
Pada dasarnya parameter action di atas dipanggil ketika kita melampirkan argumen lambda saat fungsi tersebut digunakan. 
Kemudian bisa kita perhatikan, parenthesis tidak diperlukan karena fungsi tersebut hanya memiliki satu parameter yaitu sebuah lambda expression