Відповіді:
У вас є два варіанти:
Перше і найефективніше - це використовувати associateBy
функцію, яка займає два лямбда для генерації ключа і значення, а також накреслює створення карти:
val map = friends.associateBy({it.facebookId}, {it.points})
Друга, менш ефективна, полягає у використанні стандартної map
функції для створення списку, за допомогою Pair
якого можна toMap
сформувати остаточну карту:
val map = friends.map { it.facebookId to it.points }.toMap()
Pair
екземплярів може бути дуже дорогим для великих колекцій
List
до Map
з associate
функцієюЗ Kotlin 1.3, List
має функцію під назвою associate
. associate
має таку заяву:
fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>
Повертає
Map
містять пари ключ-значення, наданіtransform
функцією, застосованою до елементів даної колекції.
Використання:
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
до Map
з associateBy
функцієюУ Котліна List
є функція під назвою associateBy
. associateBy
має таку заяву:
fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>
Повертає
Map
вміст, що містить значення, наданіvalueTransform
та індексованіkeySelector
функціями, застосованими до елементів даної колекції.
Використання:
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}
}
* Довідка: Документація Котліна
1- асоційований (для встановлення і ключів, і значень): Створіть карту, в якій можна встановити елементи ключа та значення:
IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}
Якщо будь-яка з двох пар матиме однаковий ключ, до карти додається останній.
Повернута карта зберігає порядок ітерації входу вихідного масиву.
2- AssociateBy (просто встановіть Ключі за розрахунком): Створіть карту, яку ми можемо встановити нові Ключі, аналогічні елементи будуть встановлені для значень
IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set from analogous IterableSequenceElements' ,...}
3- AssociateWith (просто встановити Значення шляхом обчислення): Створіть карту, яку ми можемо встановити нові Значення, аналогічні елементи будуть встановлені для Ключів
IterableSequenceElements.associateWith { newValue } //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}
Якщо у вашому списку є дублікати, які ви не хочете втрачати, ви можете це зробити, використовуючи groupBy
.
Інакше, як і всі інші сказали, використовуйте associate/By/With
(що у випадку дублікатів, я вважаю, поверне останнє значення лише за допомогою цього ключа).
Приклад групування списку людей за віком:
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)
}
Результати:
{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}