Ответы:
У вас есть два варианта:
Первым и наиболее эффективным является использование 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
функциейС Kotlin, 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}
}
* Ссылка: Kotlin Документация
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 , ...}
Вы можете использовать associate
для этой задачи:
val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }
В этом примере строки from list
становятся ключами, а их соответствующие длины (в качестве примера) становятся значениями внутри карты.
Если в вашем списке есть дубликаты, которые вы не хотите терять, вы можете сделать это, используяgroupBy
.
В противном случае, как и все остальные, используйте use 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}