Konvertieren einer Liste in eine Karte in Kotlin

1. Einleitung

In diesem kurzen Tutorial, werden wir sehen , wie wir eine konvertieren Liste auf eine Karte i n Kotlin.

2. Implementierung

Kotlin bietet die praktische toMap- Methode, mit der wir anhand einer Liste komplexer Objekte Elemente in unserer Liste mit den von uns angegebenen Werten abbilden können:

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

Beachten Sie, dass hier das Schlüsselwort "to" verwendet wird, um Paare von Namen und Alter zu erstellen. Diese Methode sollte eine Map zurückgeben, die die Eingabereihenfolge der Elemente im Array beibehält:

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

Das gleiche würde passieren, wenn wir ein kleineres Array von String abbilden :

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

Der einzige Unterschied besteht darin, dass wir den Wert dafür nicht angeben , da er nur dadurch zugeordnet wird.

Als zweite Alternative zum Konvertieren einer Liste in eine Karte verwenden Sie die AssociatedBy- Methode:

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

Wir haben den Test so geändert, dass er ein Array als Wert verwendet:

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

3. Welches verwenden?

Wenn beide Methoden im Wesentlichen die gleiche Funktionalität erreichen, welche sollten wir verwenden?

toMap ist in Bezug auf die Implementierung intuitiver. Bei Verwendung dieser Methode müssen wir jedoch zuerst unser Array in Paare umwandeln , die später in unsere Map übersetzt werden müssen. Daher ist dieser Vorgang besonders nützlich, wenn wir bereits mit Sammlungen von Paaren arbeiten.

Für Sammlungen anderer Typen ist die zugehörige API die beste Wahl.

4. Zuordnung mit assoziierten * Methoden

In unserem vorherigen Beispiel haben wir die AssociateBy- Methode verwendet. Das Kotlin- Sammlungspaket verfügt jedoch über unterschiedliche Versionen für unterschiedliche Anwendungsfälle.

4.1. Die assoziierte () Methode

Wir beginnen mit der Associate- Methode, die einfach eine Map mithilfe einer Transformationsfunktion für die Elemente des Arrays zurückgibt :

@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. Die AssociateTo- Methode

Mit dieser Methode können wir unsere Elemente in einer bereits vorhandenen Karte sammeln:

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

Es ist wichtig, sich daran zu erinnern, die veränderbare Karte zu verwenden - dieses Beispiel funktioniert nicht mit einer unveränderlichen.

4.3. Die AssociateByTo- Methode

Das AssociateByTo bietet uns die größte Flexibilität der drei, da wir entweder die Karte übergeben können, die gefüllt werden soll, eine keySelector- Funktion. Für jeden angegebenen Schlüssel ist der zugehörige Wert das Objekt, aus dem der Schlüssel extrahiert wurde:

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

Oder wir können eine valueTransform- Funktion verwenden:

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

Es ist wichtig zu beachten, dass bei Schlüsselkollisionen nur der letzte Mehrwert erhalten bleibt.

5. Schlussfolgerung

In diesem Artikel haben wir verschiedene Möglichkeiten zum Konvertieren einer Liste in eine Karte in Kotlin untersucht.

Wie immer finden Sie die Implementierung all dieser Beispiele und Snippets auf GitHub.