Respuestas:
Tienes dos opciones:
La primera y más eficaz es usar la associateBy
funció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 map
función estándar para crear una lista de las Pair
cuales se puede usar toMap
para generar el mapa final:
val map = friends.map { it.facebookId to it.points }.toMap()
Pair
instancias podría ser muy costosa para grandes colecciones
List
a Map
con associate
funciónCon Kotlin 1.3, List
tiene una función llamada associate
. associate
tiene la siguiente declaración:
fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>
Devuelve un
Map
par clave-valor que proporciona latransform
funció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}
}
List
a Map
con associateBy
funciónCon Kotlin, List
tiene una función llamada associateBy
. associateBy
tiene la siguiente declaración:
fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>
Devuelve un que
Map
contiene los valores proporcionadosvalueTransform
e indexados porkeySelector
funciones 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 associate
para 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 list
convierten 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}