Par exemple, j'ai une liste de chaînes comme:
val list = listOf("a", "b", "c", "d")
et je veux le convertir en une carte, où les chaînes sont les clés.
Je sais que je devrais utiliser la fonction .toMap()
, mais je ne sais pas comment, et je n'en ai pas vu d'exemples.
Vous avez deux choix:
La première et la plus performante consiste à utiliser la fonction associateBy
prenant deux lambda pour générer la clé et la valeur, et insère la création de la carte:
val map = friends.associateBy({it.facebookId}, {it.points})
Le second, moins performant, consiste à utiliser la fonction standard map
pour créer une liste de Pair
pouvant être utilisée par toMap
pour générer la carte finale:
val map = friends.map { it.facebookId to it.points }.toMap()
List
à Map
avec la fonction associate
Avec 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>
Retourne un
Map
contenant les paires clé-valeur fournies par la fonctiontransform
appliquée aux éléments de la collection donnée.
Utilisation:
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 la fonction associateBy
Avec 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>
Retourne un
Map
contenant les valeurs fournies parvalueTransform
et indexées par les fonctionskeySelector
appliquées aux éléments de la collection donnée.
Utilisation:
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}
}
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.
1- associé (Peut définir des Kays et des Valeurs): Construisez une carte qui peut définir des éléments clés et des valeurs:
IteratableSequenceEements.associate { newKey to newValue } => Map {newKey :
newValue ,...}
2- associateBy (peut simplement définir des clés par calcul): créez une carte sur laquelle vous pouvez définir de nouvelles clés, des éléments analogues seront définis pour les valeurs
IteratableSequenceEements.associateBy { newKey } => Map {newKey : 'Values will
be set from IteratableSequenceEements' ,...}
3- associateWith (peut juste définir des valeurs par calcul): Construisez une carte avec laquelle nous pouvons définir de nouvelles valeurs, des éléments analogues seront définis pour les clés
IteratableSequenceEements.associateWith { newValue } => Map { 'Keys will be set
from IteratableSequenceEements' : newValue , ...}
Cela a changé sur la version RC.
J'utilise val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })