Wie man den aktuellen Index in forEach Kotlin erhält: Vom Anfänger zum Profi
\n\nStellen Sie sich vor: Sie programmieren in Kotlin, verarbeiten eine Liste von Benutzern, und plötzlich stellen Sie fest, dass Sie nicht nur das Element, sondern auch seine Position in der Sammlung benötigen. Instinktiv greifen Sie zum altmodischen for (i in 0 until list.size)… Stopp! In Kotlin gibt es elegantere und leistungsfähigere Wege. In diesem Artikel analysieren wir, wie Sie den aktuellen Index in forEach Kotlin erhalten, vergleichen die Leistung verschiedener Ansätze und wählen den besten für Ihr Projekt aus. Dies ist nicht nur eine Übersetzung der Dokumentation – es ist das Ergebnis realer Messungen und der Erfahrung der Stack Overflow-Community.
Warum ist forEach ohne Index ein Problem?
\n\nDer Standard list.forEach { item -> ... } ist praktisch, aber wenn man die Position eines Elements kennen muss, schreiben viele Workarounds:
var index = 0\nlist.forEach { item ->\n println("$index: $item")\n index++\n}\n\nDas funktioniert, wirkt aber umständlich und ist fehleranfällig (Inkrement vergessen? Bug erhalten). Außerdem ist eine mutable Variable außerhalb der Schleife ein Verstoß gegen den funktionalen Stil und ein potenzielles Problem in Multithreading-Szenarien. Schauen wir uns die richtigen Lösungen an.
\n\nMethode 1: Verwendung von withIndex() – einfach und elegant
\n\nDie beliebteste Antwort auf Stack Overflow ist die Funktion withIndex(). Sie gibt eine Sequenz von IndexedValue-Paaren zurück, bei denen jedes Element die Felder index und value hat.
val list = listOf("Kotlin", "Java", "Python")\nlist.withIndex().forEach { (index, value) ->\n println("Element #$index: $value")\n}\n\nWas passiert hier? withIndex() erstellt eine faule Sequenz (lazy), die jedes Element in ein IndexedValue-Objekt verpackt. Die Destrukturierung (index, value) macht den Code sauber und lesbar.
Vorteile:
\n- \n
- Kompaktheit – eine Zeile statt drei \n
- Faulheit – erstellt keine unnötigen Sammlungen im Speicher \n
- Lesbarkeit – sofort ersichtlich, dass wir mit einem Index arbeiten \n
Nachteile:
\n- \n
- Geringer Overhead durch die Erstellung des
IndexedValue-Wrappers (in 99% der Fälle jedoch unbemerkt) \n
Methode 2: forEachIndexed – integrierte Alternative
\n\nKotlin bietet die vorgefertigte Funktion forEachIndexed, die ein Lambda mit zwei Parametern akzeptiert: Index und Wert.
list.forEachIndexed { index, value ->\n println("Position $index: $value")\n}\n\nDies ist praktisch dasselbe wie withIndex().forEach, jedoch ohne zusätzlichen Aufruf. Verwendet die interne Implementierung von forEachIndexed ebenfalls IndexedValue? Nein, sie übergibt den Index direkt, was etwas schneller ist.
Vorteile:
\n- \n
- Maximal kurze Schreibweise \n
- Keine Erstellung von Zwischenobjekten \n
- Idiomatisch für Kotlin \n
Nachteile:
\n- \n
- Weniger flexibel als
withIndex()– nicht kombinierbar mit anderen Operatoren in Ketten (z. B.filtervorforEach) \n
Methode 3: filterIndexed – wenn nach Index gefiltert werden muss
\n\nWenn Sie nicht nur den Index benötigen, sondern auch Elemente nach ihrer Position filtern möchten, ist filterIndexed Ihre Wahl.
val list = listOf("a", "b", "c", "d", "e")\nval evenIndexed = list.filterIndexed { index, _ -> index % 2 == 0 }\nprintln(evenIndexed) // [a, c, e]\n\nBeachten Sie: Der zweite Parameter ist das Element selbst, aber wir ignorieren es mit _. Dies ist in Kotlin eine Standardpraxis für ungenutzte Variablen.
Vorteile:
\n- \n
- Flexibilität – Kombination von Filterung und Transformation möglich \n
- Sauberer funktionaler Stil \n
Nachteile:
\n- \n
- Wen