Koleksi di Kotlin

1. Sebelum memulai

Dalam codelab ini, Anda akan mempelajari koleksi lebih lanjut, serta mempelajari lambda dan fungsi tingkat tinggi di Kotlin.

Prasyarat

  • Pemahaman dasar tentang konsep Kotlin seperti yang ditampilkan dalam codelab sebelumnya.
  • Telah terbiasa menggunakan Kotlin Playground untuk membuat dan mengedit program Kotlin.

Yang akan Anda pelajari

  • Cara menggunakan koleksi termasuk kumpulan dan peta
  • Dasar-dasar lambda
  • Dasar-dasar fungsi tingkat tinggi

Yang Anda perlukan

2. Mempelajari koleksi

Koleksi adalah kumpulan item terkait, seperti daftar kata, atau kumpulan catatan karyawan. Koleksi dapat memiliki item yang berurutan atau tidak berurutan, dan item dapat berbentuk unik atau tidak. Anda telah mempelajari satu jenis koleksi, daftar. Daftar memiliki urutan untuk item, tetapi item tidak harus unik.

Seperti halnya daftar, Kotlin membedakan antara koleksi yang dapat berubah dan tidak dapat diubah. Kotlin menyediakan berbagai fungsi untuk menambahkan atau menghapus item, melihat, dan memanipulasi koleksi.

Membuat daftar

Dalam tugas ini, Anda akan meninjau pembuatan daftar angka dan mengurutkannya.

  1. Buka Kotlin Playground.
  2. Ganti kode apa pun dengan kode ini:
fun main() {
    val numbers = listOf(0, 3, 8, 4, 0, 5, 5, 8, 9, 2)
    println("list:   ${numbers}")
}
  1. Jalankan program dengan mengetuk panah hijau, dan lihat hasil yang muncul:
list:   [0, 3, 8, 4, 0, 5, 5, 8, 9, 2]
  1. Daftar ini berisi 10 angka dari 0 sampai 9. Beberapa angka muncul lebih dari sekali, sementara beberapa lainnya tidak muncul sama sekali.
  2. Urutan item dalam daftar itu penting: item pertama adalah 0, item kedua adalah 3, dan seterusnya. Item akan tetap dalam urutan tersebut, kecuali jika diubah.
  3. Ingat kembali dari codelab sebelumnya bahwa daftar memiliki banyak fungsi bawaan, seperti sorted(), yang menampilkan salinan daftar yang diurutkan dalam urutan menaik. Setelah println(), tambahkan baris ke program Anda untuk mencetak salinan daftar yang diurutkan:
println("sorted: ${numbers.sorted()}")
  1. Jalankan lagi program Anda dan lihat hasilnya:
list:   [0, 3, 8, 4, 0, 5, 5, 8, 9, 2]
sorted: [0, 0, 2, 3, 4, 5, 5, 8, 8, 9]

Dengan nomor yang diurutkan, akan lebih mudah untuk melihat berapa kali setiap angka muncul di daftar Anda, atau apakah angka tersebut tidak muncul sama sekali.

Mempelajari kumpulan

Jenis koleksi lain di Kotlin adalah kumpulan. Ini adalah kelompok item terkait, namun tidak seperti daftar, tidak ada duplikat, dan urutan pun tidak berpengaruh. Sebuah item dapat berada di kumpulan atau tidak, tetapi jika berada dalam kumpulan, hanya ada satu salinan item tersebut. Ini mirip dengan konsep matematika dari himpunan. Contohnya, ada sekumpulan buku yang telah Anda baca. Membaca buku beberapa kali tidak akan mengubah kenyataan buku tersebut ada di kumpulan buku yang telah Anda baca.

  1. Tambahkan baris ini ke program Anda untuk mengonversi daftar ke kumpulan:
val setOfNumbers = numbers.toSet()
println("set:    ${setOfNumbers}")
  1. Jalankan program Anda dan lihat hasilnya:
list:   [0, 3, 8, 4, 0, 5, 5, 8, 9, 2]
sorted: [0, 0, 2, 3, 4, 5, 5, 8, 8, 9]
set:    [0, 3, 8, 4, 5, 9, 2]

Hasilnya memiliki semua angka dalam daftar asli, tetapi masing-masing hanya muncul sekali. Perhatikan bahwa urutannya sama seperti dalam daftar asli, tetapi urutan tersebut tidak signifikan untuk kumpulan.

  1. Tentukan kumpulan yang dapat berubah dan yang tidak dapat diubah, dan inisialisasi dengan kumpulan angka yang sama namun dalam urutan yang berbeda dengan menambahkan baris berikut:
val set1 = setOf(1,2,3)
val set2 = mutableSetOf(3,2,1)
  1. Tambahkan baris untuk mencetak apakah keduanya sama:
println("$set1 == $set2: ${set1 == set2}")
  1. Jalankan program Anda dan lihat hasil yang baru:
[1, 2, 3] == [3, 2, 1]: true

Meskipun satu kumpulan bisa berubah dan yang lain tidak, dan memiliki item dengan urutan yang berbeda, keduanya dianggap sama karena berisi kumpulan item yang persis sama.

Salah satu operasi utama yang mungkin Anda lakukan di kumpulan adalah memeriksa apakah item tertentu berada di kumpulan atau tidak dengan fungsi contains(). Anda sudah pernah melihat contains(), tetapi menggunakannya dalam daftar.

  1. Tambahkan baris ini ke program Anda untuk mencetak jika 7 berada dalam kumpulan:
println("contains 7: ${setOfNumbers.contains(7)}")
  1. Jalankan program Anda dan lihat hasil tambahannya:
contains 7: false

Anda juga dapat mencoba mengujinya dengan nilai yang ada dalam kumpulan.

Semua kode di atas:

fun main() {
    val numbers = listOf(0, 3, 8, 4, 0, 5, 5, 8, 9, 2)
    println("list:   ${numbers}")
    println("sorted: ${numbers.sorted()}")
    val setOfNumbers = numbers.toSet()
    println("set:    ${setOfNumbers}")
    val set1 = setOf(1,2,3)
    val set2 = mutableSetOf(3,2,1)
    println("$set1 == $set2: ${set1 == set2}")
    println("contains 7: ${setOfNumbers.contains(7)}")
}

Seperti halnya himpunan matematika, di Kotlin Anda juga dapat melakukan operasi seperti irisan (∩) atau gabungan (∪) dari dua kumpulan, menggunakan intersect() atau union().

Mempelajari peta

Jenis koleksi terakhir yang akan Anda pelajari di codelab ini adalah peta atau kamus. Peta adalah sekumpulan key-value pair, yang dirancang untuk memudahkan pencarian nilai yang diberikan kunci tertentu. Kunci bersifat unik, dan setiap kunci dipetakan persis ke satu nilai, namun nilainya dapat memiliki duplikat. Nilai dalam peta bisa berupa string, angka, atau objek—bahkan koleksi lain seperti daftar atau kumpulan.

b55b9042a75c56c0.png

Peta berguna saat Anda memiliki pasangan data, dan Anda dapat mengidentifikasi setiap pasangan berdasarkan kuncinya. Kunci "memetakan ke" nilai yang sesuai.

  1. Di Kotlin Playground, ganti semua kode dengan kode ini yang membuat peta yang bisa berubah untuk menyimpan nama orang dan usianya:
fun main() {
    val peopleAges = mutableMapOf<String, Int>(
        "Fred" to 30,
        "Ann" to 23
    )
    println(peopleAges)
}

Tindakan ini akan membuat peta yang dapat berubah dari String (kunci) ke Int (nilai), menginisialisasi peta dengan dua entri, dan mencetak item.

  1. Jalankan program Anda dan lihat hasilnya:
{Fred=30, Ann=23}
  1. Untuk menambahkan lebih banyak entri ke peta, Anda dapat menggunakan fungsi put(), dengan meneruskan kunci dan nilai:
peopleAges.put("Barbara", 42)
  1. Anda juga dapat menggunakan notasi shorthand untuk menambahkan entri:
peopleAges["Joe"] = 51

Berikut adalah semua kode di atas:

fun main() {
    val peopleAges = mutableMapOf<String, Int>(
        "Fred" to 30,
        "Ann" to 23
    )
    peopleAges.put("Barbara", 42)
    peopleAges["Joe"] = 51
    println(peopleAges)
}
  1. Jalankan program Anda dan lihat hasilnya:
{Fred=30, Ann=23, Barbara=42, Joe=51}

Seperti disebutkan di atas, kunci (nama) bersifat unik, tetapi nilai (usia) dapat memiliki duplikat. Apa yang dapat terjadi jika Anda mencoba menambahkan item menggunakan salah satu kunci yang sama?

  1. Sebelum println(), tambahkan baris kode ini:
peopleAges["Fred"] = 31
  1. Jalankan program Anda dan lihat hasilnya:
{Fred=31, Ann=23, Barbara=42, Joe=51}

Kunci "Fred" tidak ditambahkan lagi, tetapi nilai yang dipetakannya diperbarui menjadi 31.

Seperti yang Anda lihat, peta berguna sebagai cara cepat untuk memetakan kunci ke nilai dalam kode Anda!

3. Menangani koleksi

Meskipun memiliki kualitas yang berbeda, jenis koleksi yang berbeda memiliki banyak kesamaan perilaku. Jika dapat diubah, Anda dapat menambahkan atau menghapus item. Anda dapat menghitung semua item, menemukan item tertentu, atau terkadang mengonversi satu jenis koleksi ke jenis lainnya. Anda melakukannya di awal saat Anda mengonversi List menjadi Set dengan toSet(). Berikut adalah beberapa fungsi berguna untuk diterapkan dengan koleksi.

forEach

Misalnya Anda ingin mencetak item dalam peopleAges, dan menyertakan nama serta usia orang di dalamnya. Misalnya, "Fred is 31, Ann is 23,..." dan sebagainya. Anda telah mempelajari loop for dalam codelab sebelumnya, jadi Anda dapat menulis loop dengan for (people in peopleAges) { ... }.

Namun, penghitungan semua objek dalam koleksi adalah operasi yang umum, sehingga Kotlin menyediakan forEach(), yang memeriksa semua item untuk Anda dan melakukan pengoperasian pada setiap item.

  1. Di playground, tambahkan kode ini setelah println():
peopleAges.forEach { print("${it.key} is ${it.value}, ") }

Ini mirip dengan loop for, namun sedikit lebih ringkas. Alih-alih menentukan variabel untuk item saat ini, forEach menggunakan ID khusus it.

Perhatikan bahwa Anda tidak perlu menambahkan tanda kurung saat memanggil metode forEach(), melainkan cukup memasukkan kode dalam tanda kurung kurawal {}.

  1. Jalankan program Anda dan lihat hasil tambahannya:
Fred is 31, Ann is 23, Barbara is 42, Joe is 51,

Hasilnya nyaris mendekati dengan yang Anda inginkan, tetapi ada koma ekstra di bagian akhir.

Mengonversi koleksi menjadi string adalah operasi yang umum, dan pemisah tambahan di akhir tersebut juga merupakan masalah yang umum. Anda akan mempelajari cara mengatasinya pada langkah-langkah berikutnya.

map (peta)

Fungsi map() (yang tidak boleh disamakan dengan koleksi peta atau kamus di atas) menerapkan transformasi ke setiap item dalam koleksi.

  1. Dalam program Anda, ganti pernyataan forEach dengan baris ini:
println(peopleAges.map { "${it.key} is ${it.value}" }.joinToString(", ") )
  1. Jalankan program Anda dan lihat hasil tambahannya:
Fred is 31, Ann is 23, Barbara is 42, Joe is 51

Output-nya benar, dan tanpa koma tambahan! Ada banyak hal yang terjadi dalam satu baris, jadi lihatlah dengan lebih cermat.

  • peopleAges.map menerapkan transformasi ke setiap item dalam peopleAges dan membuat koleksi baru dari item yang ditransformasi
  • Bagian dalam tanda kurung kurawal {} menentukan transformasi yang akan diterapkan ke setiap item. Transformasi diterapkan ke key value pair dan mengubahnya menjadi string, misalnya <Fred, 31> berubah menjadi Fred is 31.
  • joinToString(", ") menambahkan setiap item dalam koleksi yang ditransformasi ke string, yang dipisahkan oleh , dan sudah tahu untuk tidak menambahkannya ke item terakhir
  • Semua ini digabungkan dengan . (operator titik), seperti yang telah Anda lakukan dengan panggilan fungsi dan akses properti dalam codelab sebelumnya

filter

Operasi lain yang umum dengan koleksi adalah menemukan item yang cocok dengan kondisi tertentu. Fungsi filter() menampilkan item dalam koleksi yang cocok, berdasarkan ekspresi.

  1. Setelah println(), tambahkan baris berikut:
val filteredNames = peopleAges.filter { it.key.length < 4 }
println(filteredNames)

Sekali lagi perhatikan bahwa panggilan ke filter tidak memerlukan tanda kurung, dan it merujuk ke item saat ini dalam daftar.

  1. Jalankan program Anda dan lihat hasil tambahannya:
{Ann=23, Joe=51}

Dalam kasus ini, ekspresi mendapatkan panjang kunci (String) dan memeriksa apakah panjangnya kurang dari 4. Setiap item yang cocok, yaitu, memiliki nama dengan kurang dari 4 karakter, ditambahkan ke koleksi baru.

Jenis yang ditampilkan saat Anda menerapkan filter ke peta adalah peta baru (LinkedHashMap). Anda dapat melakukan pemrosesan tambahan pada peta, atau mengonversinya ke jenis koleksi lain seperti daftar.

4. Mempelajari lambda dan fungsi urutan yang lebih tinggi

Lambda

Mari lihat kembali contoh sebelumnya ini:

peopleAges.forEach { print("${it.key} is ${it.value}") }

Ada variabel (peopleAges) dengan fungsi (forEach) yang dipanggil. Anda melihat beberapa kode dalam tanda kurung kurawal {} mengikuti nama fungsi, bukan tanda kurung setelah nama fungsi dengan parameter. Pola yang sama muncul pada kode yang menggunakan fungsi map dan filter dari langkah sebelumnya. Fungsi forEach dipanggil pada variabel peopleAges dan menggunakan kode dalam kurung kurawal.

Seperti Anda menulis fungsi kecil di kurung kurawal, tetapi tidak ada nama fungsi. Ide ini—sebuah fungsi tanpa nama yang bisa langsung digunakan sebagai ekspresi—adalah konsep yang sangat berguna yang disebut dengan ekspresi lambda, atau hanya lambda.

Hal ini mengarah ke topik penting tentang bagaimana Anda dapat berinteraksi dengan fungsi melalui cara yang canggih dengan Kotlin. Anda dapat menyimpan fungsi dalam variabel dan class, meneruskan fungsi sebagai argumen, dan bahkan menampilkan fungsi. Anda dapat memperlakukannya seperti pada variabel jenis lain seperti Int atau String.

Jenis fungsi

Untuk mengaktifkan jenis perilaku ini, Kotlin memiliki sesuatu yang disebut jenis fungsi, tempat Anda dapat menentukan jenis fungsi tertentu berdasarkan parameter input dan nilai yang ditampilkan. Jenis fungsi ini muncul dalam format berikut:

Contoh Jenis Fungsi: (Int) -> Int

Fungsi dengan jenis fungsi di atas harus menggunakan parameter jenis Int dan menampilkan nilai jenis Int. Pada notasi jenis fungsi, parameter dicantumkan dalam tanda kurung (dipisahkan dengan koma jika ada beberapa parameter). Selanjutnya, ada tanda panah -> yang diikuti dengan jenis nilai yang ditampilkan.

Apa jenis fungsi yang akan memenuhi kriteria ini? Anda bisa memiliki ekspresi lambda yang meningkatkan nilai input bilangan bulat sebesar tiga kali lipat, seperti yang terlihat di bawah ini. Untuk sintaksis ekspresi lambda, parameter muncul terlebih dahulu (disorot di kotak merah), diikuti dengan panah fungsi, dan diikuti dengan isi fungsi (disorot di kotak ungu). Ekspresi terakhir dalam lambda adalah nilai yang ditampilkan.

252712172e539fe2.png

Anda bahkan dapat menyimpan lambda ke dalam variabel, seperti yang ditunjukkan pada diagram di bawah. Sintaksisnya mirip dengan cara Anda mendeklarasikan variabel jenis data dasar seperti Int. Amati nama variabel (kotak kuning), jenis variabel (kotak biru), dan nilai variabel (kotak hijau). Variabel triple menyimpan fungsi. Jenisnya adalah jenis fungsi (Int) -> Int, dan nilainya adalah ekspresi lambda { a: Int -> a * 3}.

  1. Coba kode ini di playground. Tentukan dan panggil fungsi triple dengan memasukkan angka seperti 5. 4d3f2be4f253af50.png
fun main() {
    val triple: (Int) -> Int = { a: Int -> a * 3 }
    println(triple(5))
}
  1. Output yang dihasilkan harus berupa:
15
  1. Dalam tanda kurung kurawal, Anda dapat menghilangkan deklarasi parameter secara eksplisit (a: Int), menghilangkan panah fungsi (->), dan hanya memiliki isi fungsi. Perbarui fungsi triple yang dideklarasikan di fungsi main dan jalankan kodenya.
val triple: (Int) -> Int = { it * 3 }
  1. Output harus sama, tapi sekarang lambda Anda ditulis dengan lebih ringkas. Untuk contoh lambda lainnya, lihat referensi ini.
15

Fungsi tingkat tinggi

Setelah Anda mulai melihat fleksibilitas cara memanipulasi fungsi di Kotlin, mari kita bahas tentang ide lain yang benar-benar hebat, yaitu fungsi tingkat tinggi. Maksudnya adalah meneruskan fungsi (dalam hal ini lambda) ke fungsi lain, atau menampilkan fungsi dari fungsi lain.

Ternyata fungsi map, filter, dan forEach semuanya adalah contoh fungsi tingkat tinggi karena semuanya menggunakan fungsi sebagai parameter. (Dalam lambda yang diteruskan ke fungsi tingkat tinggi filter ini, Anda boleh menghilangkan parameter tunggal dan simbol panah, dan juga menggunakan parameter it.)

peopleAges.filter { it.key.length < 4 }

Berikut adalah contoh fungsi tingkat tinggi: sortedWith().

Jika ingin mengurutkan daftar string, Anda dapat menggunakan metode sorted() bawaan untuk koleksi. Namun, jika ingin mengurutkan daftar berdasarkan panjang string, Anda perlu menulis beberapa kode untuk mendapatkan panjang dua string dan membandingkannya. Kotlin memungkinkan Anda melakukannya dengan meneruskan lambda ke metode sortedWith().

  1. Di playground, buat daftar nama dan cetak yang diurutkan berdasarkan nama dengan kode ini:
fun main() {
    val peopleNames = listOf("Fred", "Ann", "Barbara", "Joe")
    println(peopleNames.sorted())
}
  1. Sekarang cetak daftar yang diurutkan berdasarkan panjang nama dengan meneruskan lambda ke fungsi sortedWith(). Lambda harus mengambil dua parameter dengan jenis yang sama dan menampilkan Int. Tambahkan baris kode ini setelah pernyataan println() di fungsi main().
println(peopleNames.sortedWith { str1: String, str2: String -> str1.length - str2.length })
  1. Jalankan program Anda dan lihat hasilnya.
[Ann, Barbara, Fred, Joe]
[Ann, Joe, Fred, Barbara]

Lambda yang diteruskan ke sortedWith() memiliki dua parameter, str1 yang merupakan String dan str2 yang merupakan String. Kemudian Anda melihat panah fungsi, yang diikuti dengan isi fungsi.

7005f5b6bc466894.png

Ingatlah bahwa ekspresi terakhir dalam lambda adalah nilai yang ditampilkan. Dalam kasus ini, parameter ini menampilkan perbedaan antara panjang string pertama dan panjang string kedua, yaitu Int. Nilai tersebut sesuai dengan yang diperlukan untuk mengurutkan: jika str1 lebih pendek dari str2, nilai yang ditampilkan akan kurang dari 0. Jika str1 dan str2 memiliki panjang yang sama, maka akan menampilkan 0. Jika str1 lebih panjang dari str2, nilai tersebut akan menampilkan nilai yang lebih besar dari 0. Dengan melakukan serangkaian perbandingan antara dua Strings sekaligus, fungsi sortedWith() menampilkan daftar yang namanya akan bertambah panjang.

OnClickListener dan OnKeyListener di Android

Sehubungan dengan apa yang telah Anda pelajari di Android sejauh ini, Anda telah menggunakan lambda di codelab sebelumnya, seperti saat Anda menyetel pemroses klik untuk tombol di aplikasi Tip Calculator:

calculateButton.setOnClickListener{ calculateTip() }

Menggunakan lambda untuk menyetel pemroses klik merupakan singkatan yang mudah digunakan. Cara panjang dalam menulis kode di atas ditampilkan di bawah ini, dan dibandingkan dengan versi yang disingkat. Anda tidak perlu memahami semua detail versi formulir yang panjang, namun perhatikan beberapa pola di antara kedua versi tersebut.

29760e0a3cac26a2.png

Amati bagaimana lambda memiliki jenis fungsi yang sama seperti metode onClick() di OnClickListener (mengambil satu argumen View dan menampilkan Unit, yang berarti tidak ada nilai yang ditampilkan).

Versi kode yang disingkat ini mungkin karena sesuatu yang disebut konversi SAM (Single-Abstract-Method) di Kotlin. Kotlin mengonversi lambda menjadi objek OnClickListener yang menerapkan metode abstrak tunggal onClick(). Anda hanya perlu memastikan bahwa jenis fungsi lambda cocok dengan jenis fungsi dari fungsi abstrak.

Karena parameter view tidak pernah digunakan di lambda, parameter ini dapat dihilangkan. Sehingga kita hanya memiliki isi fungsi di lambda.

calculateButton.setOnClickListener { calculateTip() }

Konsep-konsep ini menantang, jadi bersabarlah karena akan sangat berproses dan membutuhkan waktu lama untuk memahami konsep tersebut. Perhatikan contoh lainnya yang berikut ini. Ingat saat Anda menyetel pemroses kunci pada kolom teks "Cost of service" (Biaya layanan) di tip calculator, sehingga keyboard virtual dapat disembunyikan saat tombol Enter ditekan.

costOfServiceEditText.setOnKeyListener { view, keyCode, event -> handleKeyEvent(view, keyCode) }

Saat Anda mencari OnKeyListener, metode abstrak memiliki parameter berikut onKey(View v, int keyCode, KeyEvent event) dan menampilkan Boolean. Karena konversi SAM di Kotlin, Anda dapat meneruskan lambda ke setOnKeyListener(). Pastikan lambda memiliki jenis fungsi (View, Int, KeyEvent) -> Boolean.

Berikut adalah diagram ekspresi lambda yang digunakan di atas. Parameter ini adalah view, keyCode, dan event. Isi fungsi terdiri dari handleKeyEvent(view, keyCode) yang menggunakan parameter yang diteruskan dan menampilkan Boolean.

f73fe767b8950123.png

5. Membuat daftar kata

Sekarang mari kita gabungkan semua yang Anda pelajari tentang koleksi, lambda, dan fungsi tingkat tinggi, lalu menerapkannya pada kasus penggunaan yang nyata.

Misalnya Anda ingin membuat aplikasi Android untuk memainkan game kata atau mempelajari kosakata. Aplikasi mungkin terlihat seperti ini, dengan tombol untuk setiap huruf dalam abjad:

7539df92789fad47.png

Mengklik huruf A akan memunculkan daftar singkat beberapa kata yang dimulai dengan huruf A, dan seterusnya.

Anda akan membutuhkan koleksi kata, tetapi jenis koleksi seperti apa? Jika aplikasi akan menyertakan beberapa kata yang diawali dengan setiap huruf dalam alfabet, Anda memerlukan cara untuk menemukan atau mengatur semua kata yang dimulai dengan huruf tertentu. Agar lebih menantang, Anda dapat memilih kata yang berbeda dari koleksi setiap kali pengguna menjalankan aplikasi.

Pertama, mulai dengan daftar kata. Untuk aplikasi sungguhan, Anda menginginkan daftar kata yang lebih panjang, dan menyertakan kata-kata yang dimulai dengan semua huruf alfabet, tetapi daftar singkat sudah cukup untuk dijalankan saat ini.

  1. Ganti kode di playground Kotlin dengan kode ini:
fun main() {
    val words = listOf("about", "acute", "awesome", "balloon", "best", "brief", "class", "coffee", "creative")
}
  1. Untuk mendapatkan koleksi kata yang diawali dengan huruf B, Anda dapat menggunakan filter dengan ekspresi lambda. Tambahkan baris berikut:
val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
println(filteredWords)

Fungsi startsWith() menampilkan true jika string dimulai dengan string yang ditentukan. Anda juga dapat memintanya untuk mengabaikan huruf besar/kecil, jadi "b" akan cocok dengan "b" atau "B".

  1. Jalankan program Anda dan lihat hasilnya:
[balloon, best, brief]
  1. Ingatlah bahwa Anda ingin kata-kata diacak untuk aplikasi Anda. Dengan koleksi Kotlin, Anda dapat menggunakan fungsi shuffled() untuk membuat salinan koleksi dengan item yang diacak sembarangan. Ubah kata yang difilter agar diacak juga:
val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
    .shuffled()
  1. Jalankan program Anda dan lihat hasil yang baru:
[brief, balloon, best]

Karena kata-kata diacak, Anda mungkin melihat kata dalam urutan yang berbeda.

  1. Anda tidak menginginkan semua kata (terutama jika daftar kata yang sebenarnya panjang), hanya beberapa. Anda dapat menggunakan fungsi take() untuk mendapatkan item pertama dalam koleksi. Buat kata yang difilter hanya mencakup dua kata pertama yang diacak:
val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
    .shuffled()
    .take(2)
  1. Jalankan program Anda dan lihat hasil yang baru:
[brief, balloon]

Sekali lagi, karena mengacak kata sembarangan, Anda mungkin melihat kata yang berbeda setiap kali Anda menjalankannya.

  1. Terakhir, untuk aplikasi yang Anda ingin daftar acak kata-katanya diurutkan untuk setiap hurufnya. Seperti sebelumnya, Anda dapat menggunakan fungsi sorted() untuk menampilkan salinan koleksi dengan item yang diurutkan:
val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
    .shuffled()
    .take(2)
    .sorted()
  1. Jalankan program Anda dan lihat hasil yang baru:
[balloon, brief]

Semua kode di atas:

fun main() {
    val words = listOf("about", "acute", "awesome", "balloon", "best", "brief", "class", "coffee", "creative")
    val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
        .shuffled()
        .take(2)
        .sorted()
    println(filteredWords)
}
  1. Coba ubah kode untuk membuat daftar satu kata acak yang dimulai dengan huruf c. Apa yang harus Anda ubah pada kode di atas?
val filteredWords = words.filter { it.startsWith("c", ignoreCase = true) }
    .shuffled()
    .take(1)

Dalam aplikasi yang sebenarnya, Anda perlu menerapkan filter untuk setiap huruf alfabet, tetapi sekarang Anda tahu cara membuat daftar kata untuk setiap huruf.

Koleksi sangat canggih dan fleksibel. Ada banyak hal yang dapat dilakukan menggunakan koleksi, dan ada lebih dari satu cara untuk melakukan sesuatu. Saat mempelajari pemrograman lebih lanjut, Anda akan mempelajari cara mengetahui jenis koleksi yang tepat untuk masalah yang dihadapi dan cara terbaik untuk memprosesnya.

Lambda dan fungsi tingkat tinggi membuat bekerja dengan koleksi menjadi lebih mudah dan ringkas. Ide tersebut sangat berguna, sehingga Anda akan menggunakannya lagi dan lagi.

6. Ringkasan

  • Koleksi adalah grup item terkait
  • Koleksi dapat berubah atau tidak dapat diubah
  • Koleksi dapat diurutkan atau tidak berurutan
  • Koleksi dapat memerlukan item unik atau memungkinkan duplikat
  • Kotlin mendukung berbagai jenis koleksi termasuk daftar, kumpulan, dan peta
  • Kotlin menyediakan banyak fungsi untuk memproses dan mengubah koleksi, termasuk forEach, map, filter, sorted, dan lainnya.
  • Lambda adalah fungsi tanpa nama yang bisa diteruskan sebagai ekspresi segera. Contohnya adalah { a: Int -> a * 3 }.
  • Fungsi tingkat yang lebih tinggi berarti meneruskan fungsi ke fungsi lain, atau menampilkan fungsi dari fungsi lain.

7. Mempelajari lebih lanjut