Réponses:
Vous avez deux choix:
Le premier et le plus performant consiste à utiliser une associateBy
fonction qui prend deux lambdas pour générer la clé et la valeur, et en ligne la création de la carte:
val map = friends.associateBy({it.facebookId}, {it.points})
La seconde, moins performante, consiste à utiliser la map
fonction standard pour créer une liste Pair
dont peut être utilisée toMap
pour générer la carte finale:
val map = friends.map { it.facebookId to it.points }.toMap()
Pair
instances peuvent être très coûteuses pour les grandes collections
List
à Map
avec associate
fonctionAvec Kotlin 1.3, List
a une fonction appelée associate
. associate
a la déclaration suivante:
fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>
Renvoie une
Map
paire clé-valeur contenant fournie par latransform
fonction appliquée aux éléments de la collection donnée.
Usage:
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
avec associateBy
fonctionAvec Kotlin, List
a une fonction appelée associateBy
. associateBy
a la déclaration suivante:
fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>
Renvoie un
Map
contenant les valeurs fourniesvalueTransform
et indexées par leskeySelector
fonctions appliquées aux éléments de la collection donnée.
Usage:
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}
}
* Référence: Documentation Kotlin
1- associer (pour définir à la fois les clés et les valeurs): Construisez une carte qui peut définir des éléments clé et valeur:
IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}
Si l'une des deux paires a la même clé, la dernière est ajoutée à la carte.
La carte retournée conserve l'ordre d'itération d'entrée du tableau d'origine.
2- associéBy (il suffit de définir les clés par calcul): Construisez une carte que nous pouvons définir de nouvelles clés, des éléments analogues seront définis pour les valeurs
IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set from analogous IterableSequenceElements' ,...}
3- associé avec (il suffit de définir les valeurs par calcul): Construisez une carte que nous pouvons définir de nouvelles valeurs, des éléments analogues seront définis pour les clés
IterableSequenceElements.associateWith { newValue } //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}
Vous pouvez utiliser associate
pour cette tâche:
val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }
Dans cet exemple, les chaînes de list
deviennent les clés et leurs longueurs correspondantes (à titre d'exemple) deviennent les valeurs à l'intérieur de la carte.
Si vous avez des doublons dans votre liste que vous ne voulez pas perdre, vous pouvez le faire en utilisantgroupBy
.
Sinon, comme tout le monde l'a dit, utilisez associate/By/With
(qui dans le cas de doublons, je crois, ne renverra que la dernière valeur avec cette clé).
Un exemple de regroupement d'une liste de personnes par âge:
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)
}
Résultats:
{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}