Kotlin List in Map: Leitfaden zur Konvertierung und Code-Beschleunigung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Von der Liste zur Map: Warum ist das wichtig und wie macht man es richtig?

\n\n

Stellen Sie sich vor: Sie arbeiten an einer Kotlin-App, haben eine Liste von Benutzern aus einer API erhalten. Sie müssen schnell einen Benutzer anhand seiner ID finden. Jedes Mal die Liste zu durchsuchen ist O(n), was bei 1000+ Elementen schmerzhaft wird. Die Suche über eine Map hingegen ist O(1). Ein gewaltiger Unterschied.

\n\n

Die Frage "How to convert List to Map in Kotlin?" ist eine der beliebtesten auf Stack Overflow. Und das zu Recht: Eine falsche Konvertierung kann zu Datenverlust, Leistungseinbußen oder seltsamen Fehlern führen. Heute schauen wir uns 5 Transformationsmethoden an, von einfach bis fortgeschritten, und erfahren, wie Sie Ihren Code um das 10-fache beschleunigen können.

\n\n

Grundlegende Ansätze: associate, toMap und groupBy

\n\n

1. Der Klassiker: associate – die häufigste Wahl

\n

Die Funktion associate ist der König der Konvertierung. Sie nimmt ein Lambda entgegen, das ein Paar (Schlüssel, Wert) zurückgibt.

\n\n
data class User(val id: Int, val name: String, val age: Int)\n\nval users = listOf(\n    User(1, "Anna", 25),\n    User(2, "Boris", 30),\n    User(3, "Viktor", 22)\n)\n\n// Einfachster Fall: id -> name\nval idToNameMap: Map<Int, String> = users.associate { it.id to it.name }\nprintln(idToNameMap) // {1=Anna, 2=Boris, 3=Viktor}\n\n// Vollständiges Objekt nach id\nval userMap: Map<Int, User> = users.associate { it.id to it }\nprintln(userMap[2]) // User(id=2, name="Boris", age=30)\n
\n\n

Wichtig: Wenn es in der Liste doppelte Schlüssel gibt (überschreibt associate einfach mit dem letzten), werden Sie das nicht einmal bemerken. Seien Sie aufmerksam!

\n\n

2. toMap – wenn Sie bereits eine Sammlung von Paaren haben

\n

Wenn Sie vorab eine Liste von Paaren Pair<K, V> erstellt haben, verwenden Sie toMap().

\n\n
val pairs = listOf(\n    1 to "Anna",\n    2 to "Boris",\n    3 to "Viktor"\n)\n\nval mapFromPairs: Map<Int, String> = pairs.toMap()\nprintln(mapFromPairs) // {1=Anna, 2=Boris, 3=Viktor}\n
\n\n

toMap funktioniert auch mit Sammlungen von Map.Entry und anderen Iteratoren von Paaren.

\n\n

3. groupBy – wenn einem Schlüssel mehrere Werte zugeordnet sind

\n

Manchmal müssen Elemente nach einem Schlüssel gruppiert werden. Zum Beispiel Benutzer nach Alter gruppieren.

\n\n
val usersByAge: Map<Int, List<User>> = users.groupBy { it.age }\n// Ergebnis: {25=[User(id=1, name=Anna, age=25)], 30=[User(id=2, name=Boris, age=30)], 22=[User(id=3, name=Viktor, age=22)]}\n
\n\n

groupBy gibt ein Map<K, List<V>> zurück. Ideal für Analysen, Filterung und Berichterstellung.

\n\n

Fortgeschrittene Techniken: Wenn Standardmethoden nicht ausreichen

\n\n

4. associateBy – wenn Sie nur den Schlüssel benötigen und der Wert das Element selbst ist

\n

Die Funktion associateBy ist ein Synonym für associate { key to it }, liest sich aber besser.

\n\n
val userMapById: Map<Int, User> = users.associateBy { it.id }\n// Äquivalent zu: users.associate { it.id to it }\nprintln(userMapById[1]) // User(id=1, name=Anna, age=25)\n
\n\n

Tipp: Verwenden Sie associateBy, wenn Sie ein Wörterbuch "Schlüssel → das Objekt selbst" erstellen möchten. Der Code wird sauberer.

\n\n

5. Benutzerdefinierte Konvertierung mit Behandlung von Duplikaten

\n

Angenommen, Sie haben eine Liste von Bestellungen und mehrere Bestellungen können dieselbe ID haben (z. B. verschiedene Versionen). Der Standard-associate überschreibt einfach. Was aber, wenn Sie alle behalten möchten?

\n\n
data class Order(val id: Int, val amount: Double, val version: Int)\n\nval orders = listOf(\n    Order(1, 100.0, 1),\n    Order(1, 150.0, 2), // doppelte id, aber andere Version\n    Order(2, 200.0, 1)\n)\n\n// Variante 1: Gruppierung nach id\nval ordersGrouped: Map<Int, List<Order>> = orders.groupBy { it.id }\n// {1=[Order(1, 100.0, 1), Order(1, 150.0, 2)], 2=[O                

Blogs

Buchempfehlungen