Respuestas:
Tienes dos opciones:
La primera y más eficaz es usar la associateByfunción que toma dos lambdas para generar la clave y el valor, y alinea la creación del mapa:
val map = friends.associateBy({it.facebookId}, {it.points})
El segundo, menos eficaz, es usar la mapfunción estándar para crear una lista de las Paircuales se puede usar toMappara generar el mapa final:
val map = friends.map { it.facebookId to it.points }.toMap()
Pairinstancias podría ser muy costosa para grandes colecciones
Lista Mapcon associatefunciónCon Kotlin 1.3, Listtiene una función llamada associate. associatetiene la siguiente declaración:
fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>
Devuelve un
Mappar clave-valor que proporciona latransformfunción aplicada a los elementos de la colección dada.
Uso:
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}
}
Lista Mapcon associateByfunciónCon Kotlin, Listtiene una función llamada associateBy. associateBytiene la siguiente declaración:
fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>
Devuelve un que
Mapcontiene los valores proporcionadosvalueTransforme indexados porkeySelectorfunciones aplicadas a elementos de la colección dada.
Uso:
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}
}
* Referencia: documentación de Kotlin
1- asociado (para establecer claves y valores): cree un mapa que pueda establecer elementos clave y de valor:
IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}
Si alguno de los dos pares tuviera la misma clave, el último se agregaría al mapa.
El mapa devuelto conserva el orden de iteración de entrada de la matriz original.
2- AssociateBy (solo configure Keys por cálculo): construya un mapa en el que podamos establecer nuevas Keys, se establecerán elementos análogos para los valores
IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set from analogous IterableSequenceElements' ,...}
3- AssociatedWith (solo establecer valores por cálculo): construir un mapa que podamos establecer nuevos valores, se establecerán elementos análogos para las claves
IterableSequenceElements.associateWith { newValue } //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}
Puede usar associatepara esta tarea:
val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }
En este ejemplo, las cadenas se listconvierten en las claves y sus longitudes correspondientes (como ejemplo) se convierten en los valores dentro del mapa.
Si tiene duplicados en su lista que no desea perder, puede hacerlo usando groupBy.
De lo contrario, como todos los demás dijeron, use associate/By/With(que en el caso de duplicados, creo, solo devolverá el último valor con esa clave).
Un ejemplo que agrupa una lista de personas por edad:
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)
}
Resultados:
{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}