Yanıtlar:
İki seçeneğiniz var:
İlk ve en yüksek performans, associateBy
anahtar ve değer üretmek için iki lambda alan ve haritanın oluşturulmasını satır içine alan işlevi kullanmaktır :
val map = friends.associateBy({it.facebookId}, {it.points})
İkincisi, daha az performans, son haritayı oluşturmak için kullanılabilecek map
bir liste oluşturmak için standart işlevi kullanmaktır :Pair
toMap
val map = friends.map { it.facebookId to it.points }.toMap()
Pair
örnek tahsisi büyük koleksiyonlar için çok pahalı olabilir
List
etmek Map
ile associate
işlevinKotlin 1.3 ile List
adlandırılan bir işlevi vardır associate
. associate
aşağıdaki beyanı içerir:
fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>
Belirli bir koleksiyonun öğelerine uygulanan işlev
Map
tarafından sağlanan anahtar / değer çiftlerini döndürürtransform
.
Kullanımı:
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
etmek Map
ile associateBy
işlevinKotlin ile List
adlandırılan bir işlevi vardır associateBy
. associateBy
aşağıdaki beyanı içerir:
fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>
Belirli bir koleksiyonun öğelerine uygulanan işlevler tarafından
Map
sağlananvalueTransform
ve dizinlenen değerleri içeren bir döndürürkeySelector
.
Kullanımı:
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}
}
* Referans: Kotlin Belgeleri
1- ilişkilendirme (her iki Anahtar ve Değerleri ayarlamak için): Anahtar ve değer öğelerini ayarlayabilen bir harita oluşturun:
IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}
İki çiftten herhangi biri aynı anahtara sahip olursa, sonuncusu haritaya eklenir.
Döndürülen harita, orijinal dizinin giriş yineleme sırasını korur.
2- associateBy (sadece tuşları hesaplama ile ayarlayın): Yeni Anahtarlar ayarlayabileceğimiz bir harita oluşturun, değerler için benzer elemanlar ayarlanacaktır
IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set from analogous IterableSequenceElements' ,...}
3- associateWith (sadece hesaplamalara göre Değerleri ayarlayın): Yeni Değerler ayarlayabileceğimiz bir harita oluşturun, Tuşlar için benzer öğeler ayarlanacaktır
IterableSequenceElements.associateWith { newValue } //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}
Eğer varsa çiftleri kaybetmek istemiyorum listenizde, kullanmakta yapabilirsiniz groupBy
.
Aksi takdirde, herkesin söylediği gibi, kullanın associate/By/With
(kopyalar söz konusu olduğunda, sadece bu anahtarla son değeri döndürür).
Kişi listesini yaşa göre gruplandıran bir örnek:
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)
}
Sonuçlar:
{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}