Menggunakan jenis fungsi dan ekspresi lambda di Kotlin

1. Pengantar

Codelab ini mengajarkan jenis fungsi, cara menggunakan jenis fungsi, dan sintaksis khusus untuk ekspresi lambda.

Di Kotlin, fungsi dianggap sebagai konstruksi kelas satu. Ini berarti fungsi dapat diperlakukan sebagai jenis data. Anda dapat menyimpan fungsi dalam variabel, meneruskannya ke fungsi lain sebagai argumen, dan menampilkannya dari fungsi lain.

Seperti jenis data lain yang dapat Anda ekspresikan dengan nilai literal—seperti jenis Int dari nilai 10 dan jenis String dari nilai "Hello"—Anda juga dapat mendeklarasikan literal fungsi yang disebut ekspresi lambda atau lambda saja. Ekspresi lambda digunakan secara ekstensif dalam pengembangan Android dan secara lebih umum dalam pemrograman Kotlin.

Prasyarat

  • Memahami berbagai aspek terkait pemrograman Kotlin, seperti fungsi, pernyataan if/else, dan nullability

Yang akan Anda pelajari

  • Cara menentukan fungsi dengan sintaksis lambda.
  • Cara menyimpan fungsi dalam variabel.
  • Cara meneruskan fungsi sebagai argumen ke fungsi lain.
  • Cara menampilkan fungsi dari fungsi lain.
  • Cara menggunakan jenis fungsi nullable.
  • Cara membuat ekspresi lambda lebih ringkas.
  • Pengertian fungsi tingkat tinggi.
  • Cara menggunakan fungsi repeat()

Yang akan Anda butuhkan

  • Browser web dengan akses ke Kotlin Playground

2. Menonton video tutorial coding langsung (Opsional)

Jika Anda ingin menonton salah satu instruktur kursus saat tengah menyelesaikan codelab, putar video di bawah.

Sebaiknya luaskan video ke layar penuh (dengan ikon Simbol ini menampilkan 4 sudut pada kotak yang disorot untuk menunjukkan mode layar penuh. ini di pojok video) agar Anda dapat melihat Kotlin Playground dan kodenya dengan lebih jelas.

Langkah ini opsional. Anda juga dapat melewati video dan langsung memulai petunjuk codelab.

3. Menyimpan fungsi dalam variabel

Sejauh ini, Anda telah mempelajari cara mendeklarasikan fungsi dengan kata kunci fun. Fungsi yang dideklarasikan dengan kata kunci fun dapat dipanggil, dan akan menyebabkan kode dalam isi fungsi dieksekusi.

Sebagai konstruksi kelas satu, fungsi juga merupakan jenis data sehingga Anda dapat menyimpan fungsi dalam variabel, meneruskannya ke fungsi, dan menampilkannya dari fungsi. Mungkin Anda menginginkan kemampuan untuk mengubah perilaku bagian aplikasi saat runtime atau menanamkan fungsi composable untuk membangun tata letak seperti yang Anda lakukan di codelab sebelumnya. Semua ini dapat dilakukan oleh ekspresi lambda.

Anda dapat melihat hal ini dipraktikkan dalam trick or treat, yang mengacu pada tradisi Halloween di banyak negara saat anak-anak yang mengenakan kostum berkeliling dari rumah ke rumah dan bertanya "Trick or treat" untuk mendapatkan imbalan permen.

Simpan fungsi dalam variabel:

  1. Buka Kotlin Playground.
  2. Setelah fungsi main(), tentukan fungsi trick() tanpa parameter dan tanpa nilai yang ditampilkan yang mencetak "No treats!". Sintaksisnya sama dengan fungsi lain yang Anda lihat di codelab sebelumnya.
fun main() {

}

fun trick() {
    println("No treats!")
}
  1. Pada isi fungsi main(), buat variabel bernama trickFunction dan setel agar sama dengan trick. Anda tidak perlu menyertakan tanda kurung setelah trick karena Anda ingin menyimpan fungsi di variabel, bukan memanggil fungsi.
fun main() {
    val trickFunction = trick
}

fun trick() {
    println("No treats!")
}
  1. Jalankan kode. Tindakan ini akan menghasilkan error karena compiler Kotlin mengenali trick sebagai nama fungsi trick(), tetapi mengharapkan Anda untuk memanggil fungsi, bukan menetapkannya ke variabel.
Function invocation 'trick()' expected

Anda mencoba menyimpan trick dalam variabel trickFunction. Namun, untuk merujuk ke fungsi sebagai nilai, Anda harus menggunakan operator referensi fungsi (::). Sintaksis diilustrasikan dalam gambar ini:

a9a9bfa88485ec67.png

  1. Untuk merujuk ke fungsi sebagai nilai, tetapkan ulang trickFunction ke ::trick.
fun main() {
    val trickFunction = ::trick
}

fun trick() {
    println("No treats!")
}
  1. Jalankan kode untuk memastikan sudah tidak ada lagi error. Anda melihat peringatan bahwa trickFunction tidak pernah digunakan, tetapi masalah ini akan diperbaiki di bagian berikutnya.

Menentukan ulang fungsi dengan ekspresi lambda

Ekspresi lambda menyediakan sintaksis ringkas untuk menentukan fungsi tanpa kata kunci fun. Anda dapat menyimpan ekspresi lambda secara langsung dalam variabel tanpa referensi fungsi pada fungsi lain.

Sebelum operator penetapan (=), Anda harus menambahkan kata kunci val atau var diikuti dengan nama variabel, yang Anda gunakan saat memanggil fungsi. Setelah operator penetapan (=), tambahkan ekspresi lambda yang terdiri dari sepasang tanda kurung kurawal yang membentuk isi fungsi. Sintaksis diilustrasikan dalam gambar ini:

5e25af769cc200bc.png

Saat menentukan fungsi dengan ekspresi lambda, Anda memiliki variabel yang merujuk ke fungsi. Anda juga dapat menetapkan nilainya ke variabel lain seperti jenis lainnya dan memanggil fungsi dengan nama variabel baru.

Update kode untuk menggunakan ekspresi lambda:

  1. Tulis ulang fungsi trick() dengan ekspresi lambda. Sekarang nama trick merujuk pada nama variabel. Isi fungsi dalam kurung kurawal sekarang merupakan ekspresi lambda.
fun main() {
    val trickFunction = ::trick
}

val trick = {
    println("No treats!")
}
  1. Dalam fungsi main(), hapus operator referensi fungsi (::) karena trick sekarang merujuk ke variabel, bukan nama fungsi.
fun main() {
    val trickFunction = trick
}

val trick = {
    println("No treats!")
}
  1. Jalankan kode. Tidak ada error dan Anda dapat merujuk ke fungsi trick() tanpa operator referensi fungsi (::). Tidak ada output karena Anda masih belum memanggil fungsi.
  2. Di fungsi main(), panggil fungsi trick(), tetapi kali ini dengan menyertakan tanda kurung seperti yang Anda lakukan saat memanggil fungsi lainnya.
fun main() {
    val trickFunction = trick
    trick()
}

val trick = {
    println("No treats!")
}
  1. Jalankan kode. Isi ekspresi lambda dieksekusi.
No treats!
  1. Di fungsi main(), panggil variabel trickFunction seolah-olah itu adalah sebuah fungsi.
fun main() {
    val trickFunction = trick
    trick()
    trickFunction()
}

val trick = {
    println("No treats!")
}
  1. Jalankan kode. Fungsi ini dipanggil dua kali, pertama untuk panggilan fungsi trick() dan kedua untuk panggilan fungsi trickFunction().
No treats!
No treats!

Dengan ekspresi lambda, Anda dapat membuat variabel yang menyimpan fungsi, memanggil variabel tersebut seperti fungsi, dan menyimpannya dalam variabel lain yang dapat dipanggil seperti fungsi.

4. Menggunakan fungsi sebagai jenis data

Di codelab sebelumnya Anda telah mempelajari bahwa Kotlin memiliki inferensi jenis. Saat mendeklarasikan variabel, Anda sering kali tidak perlu menentukan jenis secara eksplisit. Pada contoh sebelumnya, compiler Kotlin dapat menyimpulkan bahwa nilai trick adalah fungsi. Namun, jika ingin menentukan jenis parameter fungsi atau jenis nilai yang ditampilkan, Anda harus mengetahui sintaksis untuk menyatakan jenis fungsi. Jenis fungsi terdiri dari kumpulan tanda kurung yang berisi daftar parameter opsional, simbol ->, dan jenis nilai yang ditampilkan. Sintaksis diilustrasikan dalam gambar ini:

5608ac5e471b424b.png

Jenis data variabel trick yang Anda deklarasikan sebelumnya adalah () -> Unit. Tanda kurung kosong karena fungsi tidak memiliki parameter apa pun. Jenis nilai yang ditampilkan adalah Unit karena fungsi tersebut tidak menampilkan apa pun. Jika Anda memiliki fungsi yang menggunakan dua parameter Int dan menampilkan Int, jenis datanya akan berupa (Int, Int) -> Int.

Deklarasikan fungsi lain dengan ekspresi lambda yang secara eksplisit menentukan jenis fungsi:

  1. Setelah variabel trick, deklarasikan variabel bernama treat sama dengan ekspresi lambda dengan isi yang mencetak "Have a treat!".
val trick = {
    println("No treats!")
}

val treat = {
    println("Have a treat!")
}
  1. Tentukan jenis data variabel treat sebagai () -> Unit.
val treat: () -> Unit = {
    println("Have a treat!")
}
  1. Di fungsi main(), panggil fungsi treat().
fun main() {
    val trickFunction = trick
    trick()
    trickFunction()
    treat()
}
  1. Jalankan kode. Fungsi treat() memiliki perilaku seperti fungsi trick(). Kedua variabel memiliki jenis data yang sama meskipun hanya variabel treat yang mendeklarasikannya secara eksplisit.
No treats!
No treats!
Have a treat!

Menggunakan suatu fungsi sebagai jenis nilai yang ditampilkan

Fungsi adalah jenis data sehingga Anda dapat menggunakannya seperti jenis data lainnya. Anda bahkan dapat menampilkan fungsi dari fungsi lain. Sintaksis diilustrasikan dalam gambar ini:

f16dd6ca0c1588f5.png

Buat fungsi yang menampilkan fungsi.

  1. Hapus kode dari fungsi main().
fun main() {

}
  1. Setelah fungsi main(), tentukan fungsi trickOrTreat() yang akan menerima parameter isTrick jenis Boolean.
fun main() {

}

fun trickOrTreat(isTrick: Boolean): () -> Unit {
}

val trick = {
    println("No treats!")
}

val treat = {
    println("Have a treat!")
}
  1. Dalam isi fungsi trickOrTreat(), tambahkan pernyataan if yang menampilkan fungsi trick() jika isTrick adalah true dan menampilkan fungsi treat() jika isTrick bernilai salah (false).
fun trickOrTreat(isTrick: Boolean): () -> Unit {
    if (isTrick) {
        return trick
    } else {
        return treat
    }
}
  1. Pada fungsi main(), buat variabel bernama treatFunction dan tetapkan variabel tersebut ke hasil pemanggilan trickOrTreat() dengan meneruskan false untuk parameter isTrick. Lalu, buat variabel kedua, bernama trickFunction, dan tetapkan ke hasil pemanggilan trickOrTreat(), kali ini teruskan true untuk parameter isTrick.
fun main() {
    val treatFunction = trickOrTreat(false)
    val trickFunction = trickOrTreat(true)
}
  1. Panggil treatFunction(), lalu panggil trickFunction() di baris berikutnya.
fun main() {
    val treatFunction = trickOrTreat(false)
    val trickFunction = trickOrTreat(true)
    treatFunction()
    trickFunction()
}
  1. Jalankan kode. Anda akan melihat output untuk setiap fungsi. Meskipun tidak memanggil fungsi trick() atau treat() secara langsung, Anda masih dapat memanggilnya karena Anda menyimpan nilai yang ditampilkan, yang diperoleh setiap kali Anda memanggil fungsi trickOrTreat(), dan memanggil fungsi dengan variabel trickFunction dan treatFunction.
Have a treat!
No treats!

Sekarang Anda sudah tahu cara fungsi menampilkan fungsi lainnya. Anda juga dapat meneruskan fungsi sebagai argumen ke fungsi lain. Mungkin Anda ingin memberikan beberapa perilaku kustom ke fungsi trickOrTreat() untuk melakukan sesuatu selain menampilkan salah satu dari kedua string. Fungsi yang menggunakan fungsi lain sebagai argumen memungkinkan Anda meneruskan fungsi yang berbeda setiap kali fungsi tersebut dipanggil.

Meneruskan fungsi ke fungsi lain sebagai argumen

Di beberapa bagian dunia yang merayakan Halloween, anak-anak menerima uang receh sebagai pengganti permen atau mereka akan menerima keduanya. Anda akan memodifikasi fungsi trickOrTreat() untuk memungkinkan bonus tambahan yang diwakili oleh fungsi dapat disediakan sebagai argumen.

Fungsi yang digunakan trickOrTreat() sebagai parameter juga harus menggunakan parameternya sendiri. Saat mendeklarasikan jenis fungsi, parameter tidak akan diberi label. Anda hanya perlu menentukan jenis data dari setiap parameter yang dipisahkan oleh sebuah koma. Sintaksis diilustrasikan dalam gambar ini:

8372d3b83d539fac.png

Saat Anda menulis ekspresi lambda untuk fungsi yang menggunakan parameter, parameter tersebut diberi nama sesuai urutan kemunculannya. Nama parameter dicantumkan setelah tanda kurung kurawal buka dan setiap nama dipisahkan dengan sebuah koma. Tanda panah (->) memisahkan nama parameter dari isi fungsi. Sintaksis diilustrasikan dalam gambar ini:

938d2adf25172873.png

Update fungsi trickOrTreat() untuk menggunakan fungsi sebagai parameter:

  1. Setelah parameter isTrick, tambahkan parameter extraTreat jenis (Int) -> String.
fun trickOrTreat(isTrick: Boolean, extraTreat: (Int) -> String): () -> Unit {
  1. Di blok else, sebelum pernyataan return, panggil println() yang akan meneruskan panggilan ke fungsi extraTreat(). Teruskan 5 ke dalam panggilan ke extraTreat().
fun trickOrTreat(isTrick: Boolean, extraTreat: (Int) -> String): () -> Unit {
    if (isTrick) {
        return trick
    } else {
        println(extraTreat(5))
        return treat
    }
}
  1. Sekarang saat memanggil fungsi trickOrTreat(), Anda harus menentukan fungsi dengan ekspresi lambda dan meneruskannya untuk parameter extraTreat. Pada fungsi main() sebelum panggilan ke fungsi trickOrTreat(), tambahkan fungsi coins(). Fungsi coins() memberi parameter Int nama quantity dan menampilkan String. Anda mungkin tidak melihat kata kunci return karena kata kunci ini memang tidak dapat digunakan dalam ekspresi lambda. Sebaliknya, hasil ekspresi terakhir dalam fungsi menjadi nilai yang ditampilkan.
fun main() {
    val coins: (Int) -> String = { quantity ->
        "$quantity quarters"
    }

    val treatFunction = trickOrTreat(false)
    val trickFunction = trickOrTreat(true)
    treatFunction()
    trickFunction()
}
  1. Setelah fungsi coins(), tambahkan fungsi cupcake() seperti yang ditunjukkan. Beri nama parameter Int quantity dan pisahkan dari isi fungsi menggunakan operator ->. Sekarang Anda dapat meneruskan fungsi coins() atau cupcake() ke fungsi trickOrTreat().
fun main() {
    val coins: (Int) -> String = { quantity ->
        "$quantity quarters"
    }

    val cupcake: (Int) -> String = { quantity ->
        "Have a cupcake!"
    }

    val treatFunction = trickOrTreat(false)
    val trickFunction = trickOrTreat(true)
    treatFunction()
    trickFunction()
}
  1. Dalam fungsi cupcake(), hapus parameter quantity dan simbol ->. Keduanya tidak digunakan sehingga Anda dapat menghilangkannya.
val cupcake: (Int) -> String = {
    "Have a cupcake!"
}
  1. Update panggilan ke fungsi trickOrTreat(). Untuk panggilan pertama, jika isTrick adalah false, teruskan fungsi coins(). Untuk panggilan kedua, jika isTrick adalah true, teruskan fungsi cupcake().
fun main() {
    val coins: (Int) -> String = { quantity ->
        "$quantity quarters"
    }

    val cupcake: (Int) -> String = {
        "Have a cupcake!"
    }

    val treatFunction = trickOrTreat(false, coins)
    val trickFunction = trickOrTreat(true, cupcake)
    treatFunction()
    trickFunction()
}
  1. Jalankan kode. Fungsi extraTreat() hanya dipanggil jika parameter isTrick disetel ke argumen false sehingga output mencakup 5 kuartal, tetapi tidak ada cupcake.
5 quarters
Have a treat!
No treats!

Jenis fungsi yang nullable

Seperti jenis data lainnya, jenis fungsi dapat dideklarasikan sebagai nullable. Dalam kasus ini, variabel dapat berisi fungsi atau null.

Untuk mendeklarasikan fungsi sebagai nullable, apit jenis fungsi dalam tanda kurung lalu diikuti dengan simbol ? di luar tanda kurung tutup. Misalnya, jika Anda ingin membuat jenis () -> String nullable, deklarasikan sebagai jenis (() -> String)?. Sintaksis diilustrasikan dalam gambar ini:

c8a004fbdc7469d.png

Buat parameter extraTreat menjadi nullable agar Anda tidak perlu menyediakan fungsi extraTreat() setiap kali memanggil fungsi trickOrTreat():

  1. Ubah jenis parameter extraTreat menjadi (() -> String)?.
fun trickOrTreat(isTrick: Boolean, extraTreat: ((Int) -> String)?): () -> Unit {
  1. Ubah panggilan ke fungsi extraTreat() untuk menggunakan pernyataan if agar hanya memanggil fungsi jika fungsi tersebut non-null. Sekarang fungsi trickOrTreat() akan terlihat seperti cuplikan kode ini:
fun trickOrTreat(isTrick: Boolean, extraTreat: ((Int) -> String)?): () -> Unit {
    if (isTrick) {
        return trick
    } else {
        if (extraTreat != null) {
            println(extraTreat(5))
        }
        return treat
    }
}
  1. Hapus fungsi cupcake(), lalu ganti argumen cupcake dengan null di panggilan kedua ke fungsi trickOrTreat().
fun main() {
    val coins: (Int) -> String = { quantity ->
        "$quantity quarters"
    }

    val treatFunction = trickOrTreat(false, coins)
    val trickFunction = trickOrTreat(true, null)
    treatFunction()
    trickFunction()
}
  1. Jalankan kode. Output tidak boleh diubah. Setelah dapat mendeklarasikan jenis fungsi sebagai nullable, Anda tidak perlu lagi meneruskan fungsi untuk parameter extraTreat.
5 quarters
Have a treat!
No treats!

5. Menulis ekspresi lambda dengan sintaksis singkat

Ekspresi lambda menyediakan berbagai cara untuk membuat kode Anda lebih ringkas. Anda akan menjelajahi beberapa di antaranya di bagian ini karena sebagian besar ekspresi lambda yang Anda temui dan tulis ditulis menggunakan sintaksis singkat.

Menghapus nama parameter

Saat menulis fungsi coins(), Anda secara eksplisit mendeklarasikan nama quantity untuk parameter Int fungsi. Namun, seperti yang telah Anda lihat dengan fungsi cupcake(), Anda dapat menghilangkan nama parameter sepenuhnya. Jika suatu fungsi memiliki satu parameter dan Anda tidak memberikan nama, Kotlin akan menetapkan nama it secara implisit. Dengan ini Anda dapat menghapus nama parameter dan simbol -> sehingga ekspresi lambda akan menjadi lebih ringkas. Sintaksis diilustrasikan dalam gambar ini:

332ea7bade5062d6.png

Update fungsi coins() agar dapat menggunakan sintaksis singkat untuk parameter:

  1. Dalam fungsi coins(), hapus nama parameter quantity dan simbol ->.
val coins: (Int) -> String = {
    "$quantity quarters"
}
  1. Ubah template string "$quantity quarters" untuk merujuk ke parameter tunggal menggunakan $it.
val coins: (Int) -> String = {
    "$it quarters"
}
  1. Jalankan kode. Kotlin mengenali nama parameter it dari parameter Int dan tetap mencetak jumlah kuartal.
5 quarters
Have a treat!
No treats!

Meneruskan ekspresi lambda langsung ke suatu fungsi

Saat ini fungsi coins() hanya digunakan di satu tempat. Bagaimana jika Anda dapat langsung meneruskan ekspresi lambda ke fungsi trickOrTreat() tanpa perlu membuat variabel terlebih dahulu?

Ekspresi lambda adalah literal fungsi, sama seperti 0 adalah literal integer atau "Hello" adalah literal string. Anda dapat meneruskan ekspresi lambda secara langsung ke panggilan fungsi. Sintaksis diilustrasikan dalam gambar ini:

39dc1086e2471ffc.png

Ubah kode sehingga Anda dapat menghapus variabel coins:

  1. Pindahkan ekspresi lambda agar dapat diteruskan langsung ke panggilan ke fungsi trickOrTreat(). Anda juga dapat meringkas ekspresi lambda menjadi satu baris.
fun main() {
    val coins: (Int) -> String = {
        "$it quarters"
    }
    val treatFunction = trickOrTreat(false, { "$it quarters" })
    val trickFunction = trickOrTreat(true, null)
    treatFunction()
    trickFunction()
}
  1. Hapus variabel coins karena tidak lagi digunakan.
fun main() {
    val treatFunction = trickOrTreat(false, { "$it quarters" })
    val trickFunction = trickOrTreat(true, null)
    treatFunction()
    trickFunction()
}
  1. Jalankan kode. Kode masih mengompilasi dan berjalan seperti yang diharapkan.
5 quarters
Have a treat!
No treats!

Menggunakan sintaksis lambda akhir

Anda dapat menggunakan opsi ringkas lainnya untuk menulis lambda jika jenis fungsi adalah parameter terakhir suatu fungsi. Jika demikian, Anda dapat menempatkan ekspresi lambda setelah tanda kurung tutup untuk memanggil fungsi. Sintaksis diilustrasikan dalam gambar ini:

3ee3176d612b54.png

Ini membuat kode Anda lebih mudah dibaca karena memisahkan ekspresi lambda dari parameter lainnya, tetapi tidak mengubah fungsi kode.

Update kode untuk menggunakan sintaksis lambda akhir:

  1. Di variabel treatFunction, pindahkan ekspresi lambda {"$it quarters"} setelah tanda kurung tutup dalam panggilan ke trickOrTreat().
val treatFunction = trickOrTreat(false) { "$it quarters" }
  1. Jalankan kode. Semuanya masih berfungsi!
5 quarters
Have a treat!
No treats!

6. Menggunakan fungsi repeat()

Jika fungsi menampilkan fungsi atau menggunakan fungsi sebagai argumen, fungsi itu disebut fungsi tingkat tinggi. Fungsi trickOrTreat() adalah contoh fungsi tingkat tinggi karena menggunakan fungsi jenis ((Int) -> String)? sebagai parameter dan menampilkan fungsi jenis () -> Unit. Kotlin menyediakan beberapa fungsi tingkat tinggi yang berguna dan dapat Anda manfaatkan dengan pengetahuan baru Anda tentang lambda.

Fungsi repeat() adalah salah satu fungsi tingkat tinggi. Fungsi repeat() merupakan cara ringkas untuk mengekspresikan loop for dengan fungsi. Anda akan sering menggunakan fungsi ini dan fungsi tingkat tinggi lainnya dalam unit berikutnya. Fungsi repeat() memiliki tanda tangan fungsi ini:

repeat(times: Int, action: (Int) -> Unit)

Parameter times merupakan frekuensi terjadinya tindakan. Parameter action adalah fungsi yang menggunakan parameter Int tunggal dan menampilkan jenis Unit. Parameter Int dari fungsi action merupakan frekuensi eksekusi tindakan sejauh ini, seperti argumen 0 untuk iterasi pertama atau argumen 1 untuk iterasi kedua. Anda dapat menggunakan fungsi repeat() untuk mengulangi kode beberapa kali, mirip dengan loop for. Sintaksis diilustrasikan dalam gambar ini:

519a2e0f5d02687.png

Daripada hanya sekali memanggil fungsi trickFunction(), Anda dapat memanggilnya beberapa kali dengan fungsi repeat().

Update kode trick-or-treat untuk melihat cara kerja fungsi repeat():

  1. Pada fungsi main(), panggil fungsi repeat() di antara panggilan ke treatFunction() dan trickFunction(). Teruskan 4 untuk parameter times dan gunakan sintaksis lambda akhir untuk fungsi action. Anda tidak perlu memberikan nama untuk parameter Int ekspresi lambda.
fun main() {
    val treatFunction = trickOrTreat(false) { "$it quarters" }
    val trickFunction = trickOrTreat(true, null)
    treatFunction()
    trickFunction()
    repeat(4) {

    }
}
  1. Pindahkan panggilan ke fungsi treatFunction() ke dalam ekspresi lambda fungsi repeat().
fun main() {
    val treatFunction = trickOrTreat(false) { "$it quarters" }
    val trickFunction = trickOrTreat(true, null)
    repeat(4) {
        treatFunction()
    }
    trickFunction()
}
  1. Jalankan kode. String "Have a treat" akan dicetak empat kali.
5 quarters
Have a treat!
Have a treat!
Have a treat!
Have a treat!
No treats!

7. Kesimpulan

Selamat! Anda telah mempelajari dasar-dasar jenis fungsi dan ekspresi lambda. Pemahaman terhadap konsep ini akan membantu Anda saat mempelajari bahasa Kotlin lebih lanjut. Penggunaan jenis fungsi, fungsi tingkat tinggi, dan sintaksis singkat juga akan membuat kode Anda lebih ringkas dan mudah dibaca.

Ringkasan

  • Fungsi di Kotlin merupakan konstruksi kelas satu dan dapat diperlakukan seperti jenis data.
  • Ekspresi lambda menyediakan sintaksis singkat untuk menulis fungsi.
  • Anda dapat meneruskan jenis fungsi ke fungsi lain.
  • Anda dapat menampilkan jenis fungsi dari fungsi lain.
  • Ekspresi lambda menampilkan nilai ekspresi terakhir.
  • Jika label parameter dihilangkan dalam ekspresi lambda dengan parameter tunggal, parameter tersebut akan dirujuk dengan ID it.
  • Lambda dapat ditulis inline tanpa nama variabel.
  • Jika parameter terakhir fungsi merupakan jenis fungsi, Anda dapat menggunakan sintaksis lambda akhir untuk memindahkan ekspresi lambda setelah tanda kurung terakhir saat memanggil fungsi.
  • Fungsi tingkat tinggi merupakan fungsi yang menggunakan fungsi lain sebagai parameter atau menampilkan fungsi.
  • Fungsi repeat() merupakan fungsi tingkat tinggi yang berfungsi mirip dengan loop for.

Pelajari lebih lanjut