Conversione di un elenco in una mappa in Kotlin

1. Introduzione

In questo breve tutorial, vedremo come possiamo convertire un elenco ad una mappa i n Kotlin.

2. Implementazione

Kotlin offre il comodo metodo toMap che, dato un elenco di oggetti complessi, ci consentirà di avere elementi nel nostro elenco mappati da qualsiasi valore fornito:

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) }

Tieni presente che la parola chiave "a" viene utilizzata qui per creare coppie di nomi ed età. Questo metodo dovrebbe restituire una mappa che preserva l'ordine di entrata degli elementi nell'array:

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

Lo stesso accadrebbe quando mappiamo un array più piccolo di String :

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

L'unica differenza è che noi non specificare il valore per esso dal momento che verrà mappato solo da quella.

Quindi come seconda alternativa per convertire un elenco in una mappa è utilizzare il metodo associatedBy :

@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")) }

Abbiamo modificato il test in modo che utilizzi un array come valore:

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

3. Quale usare?

Se entrambi i metodi ottengono essenzialmente la stessa funzionalità, quale dovremmo usare?

toMap , in termini di implementazione, è più intuitivo. Tuttavia, l'utilizzo di questo metodo ci richiede di trasformare prima il nostro Array in coppie , che in seguito dovranno essere tradotte nella nostra mappa , quindi questa operazione sarà particolarmente utile se stiamo già operando su raccolte di coppie.

Per raccolte di altri tipi, l' API associata sarà la scelta migliore.

4. Mappatura utilizzando i metodi associati *

Nel nostro esempio precedente, abbiamo utilizzato il metodo associateBy , tuttavia, il pacchetto delle collezioni Kotlin ha versioni diverse per diversi casi d'uso.

4.1. Il metodo associate ()

Inizieremo utilizzando il metodo associate , che restituisce semplicemente una mappa utilizzando una funzione di trasformazione sugli elementi dell'array:

@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. Il metodo associateTo

Utilizzando questo metodo, possiamo raccogliere i nostri elementi su una mappa già esistente:

@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") }

È importante ricordare di utilizzare la mappa mutabile : questo esempio non funzionerà con una mappa immutabile.

4.3. Il metodo associateByTo

L'associateByTo ci dà la massima flessibilità dei tre dal momento che possiamo sia passare la mappa che verrà popolata, un keySelector funzioni. Per ogni chiave specificata, il valore associato sarà l'oggetto da cui è stata estratta la chiave:

@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) }

Oppure possiamo usare una funzione valueTransform :

@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) }

È importante ricordare che se si verificano collisioni di chiavi, viene mantenuto solo l'ultimo valore aggiunto.

5. conclusione

In questo articolo, abbiamo esplorato diversi modi per convertire un elenco in una mappa in Kotlin.

Come sempre, l'implementazione di tutti questi esempi e snippet può essere trovata su GitHub.