Jawaban:
Anda memiliki dua pilihan:
Performan pertama dan yang paling banyak adalah menggunakan associateBy
fungsi yang mengambil dua lambdas untuk menghasilkan kunci dan nilai, dan menguraikan pembuatan peta:
val map = friends.associateBy({it.facebookId}, {it.points})
Yang kedua, yang kurang performan, adalah menggunakan map
fungsi standar untuk membuat daftar Pair
yang dapat digunakan toMap
untuk menghasilkan peta akhir:
val map = friends.map { it.facebookId to it.points }.toMap()
Pair
instance mungkin sangat mahal untuk koleksi besar
List
ke Map
dengan associate
fungsiDengan Kotlin 1.3, List
memiliki fungsi yang disebut associate
. associate
memiliki deklarasi berikut:
fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>
Pengembalian a
Map
pasangan nilai kunci yang disediakan olehtransform
fungsi yang diterapkan ke elemen koleksi yang diberikan.
Pemakaian:
class Person(val name: String, val id: Int)
fun main() {
val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
val map = friends.associate({ Pair(it.id, it.name) })
//val map = friends.associate({ it.id to it.name }) // also works
println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}
List
ke Map
dengan associateBy
fungsiDengan Kotlin, List
memiliki fungsi yang disebut associateBy
. associateBy
memiliki deklarasi berikut:
fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>
Mengembalikan yang
Map
berisi nilai-nilai yang disediakan olehvalueTransform
dan diindeks olehkeySelector
fungsi yang diterapkan ke elemen dari koleksi yang diberikan.
Pemakaian:
class Person(val name: String, val id: Int)
fun main() {
val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
val map = friends.associateBy(keySelector = { person -> person.id }, valueTransform = { person -> person.name })
//val map = friends.associateBy({ it.id }, { it.name }) // also works
println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}
*Referensi: Dokumentasi Kotlin
1- associate (untuk mengatur Kunci & Nilai): Buat peta yang dapat mengatur elemen kunci & nilai:
IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}
Jika salah satu dari dua pasangan memiliki kunci yang sama, yang terakhir ditambahkan ke peta.
Peta yang dikembalikan mempertahankan urutan iterasi entri dari array asli.
2- associateBy (cukup atur Tombol dengan perhitungan): Buat peta yang bisa kita atur Tombol baru, elemen analog akan ditetapkan untuk nilai
IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set from analogous IterableSequenceElements' ,...}
3- associateWith (cukup tetapkan Nilai dengan perhitungan): Buat peta yang bisa kita atur Nilai baru, elemen analog akan ditetapkan untuk Kunci
IterableSequenceElements.associateWith { newValue } //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}
Jika Anda memiliki duplikat dalam daftar yang tidak ingin hilang, Anda dapat melakukannya menggunakan ini groupBy
.
Kalau tidak, seperti kata orang lain, gunakan associate/By/With
(yang dalam kasus duplikat, saya percaya, hanya akan mengembalikan nilai terakhir dengan kunci itu).
Contoh pengelompokan daftar orang berdasarkan usia:
class Person(val name: String, val age: Int)
fun main() {
val people = listOf(Person("Sue Helen", 31), Person("JR", 25), Person("Pamela", 31))
val duplicatesKept = people.groupBy { it.age }
val duplicatesLost = people.associateBy({ it.age }, { it })
println(duplicatesKept)
println(duplicatesLost)
}
Hasil:
{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}