Ein Handbuch zu Iterator in Java

Eine Anleitung zum Iterator in Java

1. Einführung

EinIterator ist eine von vielen Möglichkeiten, wie wir eine Sammlung durchlaufen können, und wie jede Option hat sie ihre Vor- und Nachteile.

Es wurde erstmals in Java 1.2 als Ersatz fürEnumerations eingeführt und:

In diesem Tutorial werden wir die einfacheIterator-Schnittstelle überprüfen, um zu erfahren, wie wir die verschiedenen Methoden verwenden können.

Wir werden auch die robustereListIterator-Erweiterung überprüfen, die einige interessante Funktionen hinzufügt.

2. DieIterator-Schnittstelle

Zu Beginn müssen wir einIterator von einemCollection erhalten; Dies erfolgt durch Aufrufen der Methodeiterator().

Der Einfachheit halber erhalten wir die Instanz vonIteratoraus einer Liste:

List items = ...
Iterator iter = items.iterator();

DieIterator-Schnittstelle verfügt über drei Kernmethoden:

2.1. hasNext()

Mit derhasNext()-Methode kann überprüft werden, ob noch mindestens ein Element zum Durchlaufen übrig ist.

Es wurde entwickelt, um als Bedingung inwhile Schleifen verwendet zu werden:

while (iter.hasNext()) {
    // ...
}

2.2. next()

Dienext()-Methode kann verwendet werden, um über das nächste Element zu springen und es zu erhalten:

String next = iter.next();

Es wird empfohlen,hasNext() zu verwenden, bevor Sie versuchen,next() aufzurufen.

Iterators fürCollections garantieren keine Iteration in einer bestimmten Reihenfolgeunless particular implementation provides it.

2.3. remove()

Wenn wir schließlichremove the current element from the collection, wollen, können wirremove: verwenden

iter.remove();

Dies ist ein sicherer Weg, um Elemente zu entfernen, während Sie über eine Sammlung iterieren, ohne das Risiko vonConcurrentModificationException.

2.4. VollesIterator Beispiel

Jetzt können wir sie alle kombinieren und sehen, wie wir die drei Methoden zusammen für die Sammlungsfilterung verwenden:

while (iter.hasNext()) {
    String next = iter.next();
    System.out.println(next);

    if( "TWO".equals(next)) {
        iter.remove();
    }
}

Auf diese Weise verwenden wir normalerweiseIterator,, die wir vorab prüfen, ob es ein anderes Element gibt. Wir rufen es ab und führen dann eine Aktion darauf aus.

2.5. Iterieren mit Lambda-Ausdrücken

Wie wir in den vorherigen Beispielen gesehen haben, ist es sehr ausführlich, einIterator zu verwenden, wenn wir nur alle Elemente durchgehen und etwas damit tun möchten.

Seit Java 8 haben wir die MethodeforEachRemaining, mit der Lambdas zur Verarbeitung verbleibender Elemente verwendet werden können:

iter.forEachRemaining(System.out::println);

3. DieListIterator-Schnittstelle

ListIterator ist eine Erweiterung, die neue Funktionen zum Durchlaufen von Listen hinzufügt:

ListIterator listIterator = items.listIterator(items.size());

Beachten Sie, wie wir eine Startposition bereitstellen können, die in diesem Fall das Ende vonList. ist

3.1. hasPrevious() undprevious()

ListIterator kann für die Rückwärtsdurchquerung verwendet werden, sodass Äquivalente vonhasNext() undnext() bereitgestellt werden:

while(listIterator.hasPrevious()) {
    String previous = listIterator.previous();
}

3.2. nextIndex() undpreviousIndex()

Zusätzlich können wir über Indizes und nicht über tatsächliche Elemente hinweggehen:

String nextWithIndex = items.get(listIterator.nextIndex());
String previousWithIndex = items.get(listIterator.previousIndex());

Dies kann sich als sehr nützlich erweisen, wenn wir die Indizes der Objekte kennen müssen, die wir gerade ändern, oder wenn wir entfernte Elemente aufzeichnen möchten.

3.3. add()

Die Methodeadd, mit der wir, wie der Name schon sagt, ein Elementbefore the item that would be returned by next() and after the one returned by previous(): hinzufügen können

listIterator.add("FOUR");

3.4. set()

Die letzte erwähnenswerte Methode istset(),, mit der wir das im Aufruf zurückgegebene Element durchnext() oderprevious() ersetzen können:

String next = listIterator.next();
if( "ONE".equals(next)) {
    listIterator.set("SWAPPED");
}

Es ist wichtig zu beachten, dassthis can only be executed if no prior calls to add() or remove() were made.

3.5. VollesListIterator Beispiel

Wir können sie jetzt alle zu einem vollständigen Beispiel zusammenfassen:

ListIterator listIterator = items.listIterator();
while(listIterator.hasNext()) {
    String nextWithIndex = items.get(listIterator.nextIndex());
    String next = listIterator.next();
    if("REPLACE ME".equals(next)) {
        listIterator.set("REPLACED");
    }
}
listIterator.add("NEW");
while(listIterator.hasPrevious()) {
    String previousWithIndex
     = items.get(listIterator.previousIndex());
    String previous = listIterator.previous();
    System.out.println(previous);
}

In diesem Beispiel erhalten wir zunächstListIterator ausList, dann können wir das nächste Element entweder durch Index -which doesn’t increase the iterator’s internal current element - oder durch Aufrufen vonnext erhalten.

Dann können wir ein bestimmtes Element durchset ersetzen und ein neues durchadd. einfügen

Nachdem wir das Ende der Iteration erreicht haben, können wir zurückgehen, um zusätzliche Elemente zu ändern oder sie einfach von unten nach oben zu drucken.

4. Fazit

DieIterator-Schnittstelle ermöglicht es uns, eine Sammlung während des Durchlaufs zu ändern, was mit einer einfachen for / while-Anweisung schwieriger ist. Dies gibt uns wiederum ein gutes Muster, das wir in vielen Methoden verwenden können, bei denen nur eine Kollektionsverarbeitung erforderlich ist, während eine gute Kohäsion und eine geringe Kopplung erhalten bleiben.

Schließlich ist wie immer der vollständige Quellcodeover at GitHub verfügbar.