Von der Liste zur Map: Warum ist das wichtig und wie macht man es richtig?
\n\nStellen 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\nDie 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\nGrundlegende Ansätze: associate, toMap und groupBy
\n\n1. Der Klassiker: associate – die häufigste Wahl
\nDie Funktion associate ist der König der Konvertierung. Sie nimmt ein Lambda entgegen, das ein Paar (Schlüssel, Wert) zurückgibt.
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\nWichtig: Wenn es in der Liste doppelte Schlüssel gibt (überschreibt associate einfach mit dem letzten), werden Sie das nicht einmal bemerken. Seien Sie aufmerksam!
2. toMap – wenn Sie bereits eine Sammlung von Paaren haben
\nWenn Sie vorab eine Liste von Paaren Pair<K, V> erstellt haben, verwenden Sie toMap().
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\ntoMap funktioniert auch mit Sammlungen von Map.Entry und anderen Iteratoren von Paaren.
3. groupBy – wenn einem Schlüssel mehrere Werte zugeordnet sind
\nManchmal müssen Elemente nach einem Schlüssel gruppiert werden. Zum Beispiel Benutzer nach Alter gruppieren.
\n\nval 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\ngroupBy gibt ein Map<K, List<V>> zurück. Ideal für Analysen, Filterung und Berichterstellung.
Fortgeschrittene Techniken: Wenn Standardmethoden nicht ausreichen
\n\n4. associateBy – wenn Sie nur den Schlüssel benötigen und der Wert das Element selbst ist
\nDie Funktion associateBy ist ein Synonym für associate { key to it }, liest sich aber besser.
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\nTipp: Verwenden Sie associateBy, wenn Sie ein Wörterbuch "Schlüssel → das Objekt selbst" erstellen möchten. Der Code wird sauberer.
5. Benutzerdefinierte Konvertierung mit Behandlung von Duplikaten
\nAngenommen, 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?
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