Konvertieren einer Liste in Kotlin in eine Karte

Konvertieren einer Liste in eine Karte in Kotlin

1. Einführung

In diesem kurzen Tutorial werden wir sehen, wie wir einList in einMap in Kotlin konvertieren können.

2. Implementierung

Kotlin bietet die praktische MethodetoMapan, mit der wir bei 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 das Schlüsselwort“to”hier verwendet wird, um Paare von Namen und Alter zu erstellen. Diese Methode sollte eine Zuordnung 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 vonString 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 fürit nicht angeben, da er nur dadurch zugeordnet wird.

Als zweite Alternative zum Konvertieren vonList inMap wird die MethodeassociatedBy verwendet:

@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 erzielen, welche sollten wir verwenden?

toMap ist in Bezug auf die Implementierung intuitiver. Bei dieser Methode müssen wir jedoch zuerst unsereArray inPairs umwandeln, die später in unsereMap übersetzt werden müssen, alsothis operation will be particularly useful if we’re already operating on collections of Pairs.

Für Sammlungen anderer Typen ist dieassociate-API die beste Wahl.

4. Zuordnung mitassociate* Methoden

In unserem vorherigen Beispiel haben wir die MethodeassociateByverwendet. Das Paket Kotlincollectionsverfügt jedoch über unterschiedliche Versionen für unterschiedliche Anwendungsfälle.

4.1. Dieassociate()-Methode

Wir beginnen mit der Methodeassociate, die einfachMap zurückgibt, indem wir eine Transformationsfunktion für die Elemente des Arrays verwenden:

@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. DieassociateTo-Methode

Mit dieser Methode können wir unsere Elemente auf 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änderlichenMap –zu verwenden. Dieses Beispiel funktioniert nicht mit einem unveränderlichen.

4.3. DieassociateByTo-Methode

DasassociateByTo gibt uns die größte Flexibilität der drei, da wir entweder die Karte übergeben können, die gefüllt werden soll, einekeySelector-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 einevalueTransform-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, sich daran zu erinnern, dassif key collisions happen, only the last added value is retained.

5. Fazit

In diesem Artikel haben wir verschiedene Möglichkeiten untersucht, einList in einMap in Kotlin umzuwandeln.

Wie immer kann die Implementierung all dieser Beispiele und Snippets inover on GitHub gefunden werden. Dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.