Iterator
Kurz: Ein Objekt, mit dem sich die Elemente einer Collection nacheinander durchlaufen lassen, ohne die konkrete interne Implementierung der Datenstruktur kennen zu müssen.
Genauer: Ein Iterator merkt sich intern die aktuelle Position und bietet typischerweise zwei Kernoperationen: prüfen, ob noch ein weiteres Element folgt, und das nächste Element abrufen. Dadurch lässt sich derselbe Durchlauf-Code für ganz unterschiedliche Datenstrukturen (Liste, Menge, Map) wiederverwenden — die “for-each”-Schleife vieler Sprachen ist meist nur eine bequeme Kurzschreibweise für die Arbeit mit einem Iterator.
Im Detail
Ohne einen Iterator müsste jeder Code, der eine Collection durchläuft, deren interne Struktur kennen — bei einem Array wäre das ein Index-Zähler, bei einer verketteten Liste das Folgen von “nächstes Element”-Zeigern, bei einem Baum eine ganz andere Traversierungslogik. Der Iterator versteckt diesen Unterschied hinter einer einheitlichen Schnittstelle, ein klassisches Beispiel für Abstraktion.
iterator = liste.erzeuge_iterator()
solange iterator.hat_naechstes():
element = iterator.naechstes()
verarbeite(element)Die meisten modernen Sprachen bieten dafür eine bequemere Kurzschreibweise, die intern trotzdem einen Iterator verwendet:
for element in meine_liste: # nutzt unter der Haube einen Iterator
verarbeite(element)Ein wichtiger Fallstrick: Eine Collection während der Iteration über sie zu verändern (z. B. ein Element mitten im Durchlauf zu entfernen) führt in vielen Sprachen zu einem Fehler zur Laufzeit (“ConcurrentModificationException” in Java) oder zu unvorhersehbarem Verhalten, weil der Iterator seine gemerkte Position nicht mehr zuverlässig mit der veränderten Struktur abgleichen kann. Für “während des Durchlaufs entfernen” bieten viele Sprachen deshalb eine explizite remove()-Methode direkt AM Iterator, die sicher mit dieser Situation umgeht, statt die Collection selbst von außen zu verändern.
Ein Iterator ist außerdem grundsätzlich einmalig und vorwärts-gerichtet — ist man einmal am Ende angekommen, muss man einen neuen Iterator von der Collection anfordern, um erneut von vorn zu beginnen; er “merkt sich” keinen Reset-Zustand.
Siehe auch: Collections, For-Schleife