Conversion d’une liste en carte dans Kotlin

Conversion d'une liste en carte dans Kotlin

1. introduction

Dans ce rapide tutoriel, nous allons voir comment nous pouvons convertir unList en unMap in Kotlin.

2. la mise en oeuvre

Kotlin propose la méthode pratiquetoMap qui, étant donné une liste d'objets complexes, nous permettra d'avoir des éléments dans notre liste mappés par toutes les valeurs que nous fournissons:

val user1 = User("John", 18, listOf("Hiking"))
val user2 = User("Sara", 25, listOf("Chess"))
val user3 = User("Dave", 34, listOf("Games"))

@Test
fun givenList_whenConvertToMap_thenResult() {
    val myList = listOf(user1, user2, user3)
    val myMap = myList.map { it.name to it.age }.toMap()

    assertTrue(myMap.get("John") == 18)
}

Gardez à l'esprit que le mot-clé“to” est utilisé ici pour créer des paires de noms et d'âges. Cette méthode devrait retourner une carte qui préserve l'ordre d'entrée des éléments dans le tableau:

{John=18, Sara=25, Dave=34}

La même chose se produirait lorsque nous mappions un plus petit tableau deString:

@Test
fun givenStringList_whenConvertToMap_thenResult() {
    val myList = listOf("a", "b", "c")
    val myMap = myList.map { it to it }.toMap()

    assertTrue(myMap.get("a") == "a")
}

La seule différence est que nous ne spécifions pas la valeur deit car elle ne sera mappée que par cela.

Ensuite, comme deuxième alternative pour convertir unList en unMap est d'utiliser la méthodeassociatedBy:

@Test
fun givenList_whenAssociatedBy_thenResult() {
    val myList = listOf(user1, user2, user3)
    val myMap = myList.associateBy({ it.name }, { it.hobbies })

    assertTrue(myMap.get("John")!!.contains("Hiking"))
}

Nous avons modifié le test pour qu'il utilise un tableau comme valeur:

{
    John=[Hiking, Swimming],
    Sara=[Chess, Board Games],
    Dave=[Games, Racing sports]
}

3. Lequel utiliser?

Si les deux méthodes ont essentiellement la même fonctionnalité, laquelle faut-il utiliser?

toMap, en termes d'implémentation, est plus intuitif. Cependant, utiliser cette méthode nous oblige à transformer d'abord nosArray enPairs, qui devront ensuite être traduits en nosMap, doncthis operation will be particularly useful if we’re already operating on collections of Pairs.

Pour les collections d'autres types, l'APIassociate sera le meilleur choix.

4. Cartographie à l'aide des méthodesassociate*

Dans notre exemple précédent, nous avons utilisé la méthodeassociateBy, cependant, le package Kotlincollections a différentes versions pour différents cas d'utilisation.

4.1. La méthodeassociate()

Nous allons commencer par utiliser la méthodeassociate - qui renvoie simplement unMap en utilisant une fonction de transformation sur les éléments du tableau:

@Test
fun givenStringList_whenAssociate_thenResult() {
    val myList = listOf("a", "b", "c", "d")
    val myMap = myList.associate{ it to it }

    assertTrue(myMap.get("a") == "a")
}

4.2. La méthodeassociateTo

En utilisant cette méthode, nous pouvons rassembler nos éléments sur une carte déjà existante:

@Test
fun givenStringList_whenAssociateTo_thenResult() {
    val myList = listOf("a", "b", "c", "c", "b")
    val myMap = mutableMapOf()

    myList.associateTo(myMap) {it to it}

    assertTrue(myMap.get("a") == "a")
}

Il est important de se rappeler d’utiliser lesMap –mutables. Cet exemple ne fonctionnera pas avec un exemple immuable.

4.3. La méthodeassociateByTo

LeassociateByTo nous donne la plus grande flexibilité des trois puisque nous pouvons soit passer la carte qui sera peuplée, soit une fonctionkeySelector. Pour chaque clé spécifiée, la valeur associée sera l'objet à partir duquel la clé a été extraite:

@Test
fun givenStringList_whenAssociateByToUser_thenResult() {
    val myList = listOf(user1, user2, user3, user4)
    val myMap = mutableMapOf()

    myList.associateByTo(myMap) {it.name}

    assertTrue(myMap.get("Dave")!!.age == 34)
}

Ou nous pouvons utiliser une fonctionvalueTransform:

@Test
fun givenStringList_whenAssociateByTo_thenResult() {
    val myList = listOf(user1, user2, user3, user4)
    val myMap = mutableMapOf()

    myList.associateByTo(myMap, {it.name}, {it.age})

    assertTrue(myMap.get("Dave") == 34)
}

Il est important de se rappeler queif key collisions happen, only the last added value is retained.

5. Conclusion

Dans cet article, nous avons exploré différentes manières de convertir unList en unMap dans Kotlin.

Comme toujours, l'implémentation de tous ces exemples et extraits de code peut être trouvéeover on GitHub. Ceci est un projet basé sur Maven, il devrait donc être facile à importer et à exécuter.