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 perhatikan kode yang tidak menggunakan DSL di bawah ini:

1. fun buildString(): String { 2.     val stringBuilder = StringBuilder() 3.     stringBuilder.append("Hello ") 4.     stringBuilder.append("from ") 5.     stringBuilder.append("lambda") 6.     return stringBuilder.toString() 7. }

Kode di atas merupakan contoh kode StringBuilder yang digunakan untuk menambahkan kata satu per satu. Jika dilihat kode ini cukup panjang tidak fleksibel. Jika Anda ingin membuat menambahkan kata baru harus di dalam kode tersebut dan mengulang-ulang kata stringBuilder. Dengan menggunakan DSL, Anda dapat menyingkat kode tersebut dan cukup fokus pada fungsi append-nya saja. Berikut adalah contoh membuat Lambda with Receiver:

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. */

Seperti yang Anda lihat, kita sebagai client bisa menggunakan suatu fungsi yang kompleks cukup dengan menggunakan fungsi append yang dipanggil di dalam block buildString. Anda tidak perlu tahu bagaimana proses buildString di baliknya, yang terpenting adalah hasilnya sesuai dengan yang diharapkan.

Ini merupakan salah satu konsep dasar untuk membuat kode yang lebih simpel seperti yang diterapkan pada Gradle KTS dan Jetpack Compose.