codestory

Die Anleitung zu Java Iterator

  1. Iterator
  2. Examples
  3. remove()
  4. forEachRemaining(Consumer)
  5. ListIterator

1. Iterator

Iterator ist eine der Möglichkeiten, Elemente einer Collection zu durchlaufen. Unten sind das die Eigenschaften von Iterator:
  • Iterator garantiert keine Iteration Reihenfolge von Elementen.
  • Iterator können die Elemente während der Iteration aus Collection entfernt werden, was vom Typ von Collection abhängt.
Die Hierarchie der Unter-Interface von Iterator:
Der Grund, warum Sie die Elemente einer Collection mit Iterator durchlaufen können, liegt darin, dass sich die Collection über die Interface Iterable erstreckt.
Collection Interface
// Definition of the Collection interface:
public interface Collection<E> extends Iterable<E>

// Definition of the Iterable interface:
public interface Iterable<T> {
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}
Iterator Methods
boolean hasNext()

E next();

// Optional operation.
default void remove()  

default void forEachRemaining(Consumer<? super E> action)

2. Examples

Mit einem Objekt Collection können Sie einen Iterator durch die Methode Collection.iterator() erstellen. Und dann mit der Methode next() über die Elemente von Iterator iterieren.
Zum Beispiel:
IteratorEx1.java
package org.o7planning.iterator.ex;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorEx1 {

    public static void main(String[] args) {
        // List is a subinterface of Collection.
        List<String> flowers = new ArrayList<String>();

        flowers.add("Tulip");
        flowers.add("Daffodil");
        flowers.add("Poppy");
        flowers.add("Sunflower");
        flowers.add("Bluebell");
        
        Iterator<String> iterator = flowers.iterator();
        
        while(iterator.hasNext()) {
            String flower = iterator.next();
            System.out.println(flower);
        }
    }
}
Output:
Tulip
Daffodil
Poppy
Sunflower
Bluebell

3. remove()

Während Sie die Elemente einer Collection mit einem Iterator durchlaufen, können Sie das aktuelle Element aus Collection entfernen. Mit der Methode Iterator.remove() können Sie das tun. Allerdings unterstützen nicht alle Iterator diesen Vorgang, dies hängt vom Typ der Collection ab. Wenn dies nicht unterstützt wird, wird UnsupportedOperationException ausgelöst.
// Optional Operation
public default void remove()
Z.B: Ein ArrayList<Integer> enthält die Zahlen. Wir werden seine Elemente durchlaufen und das aktuelle Element entfernen wenn es gerade ist.
Iterator_remove_ex1.java
package org.o7planning.iterator.ex;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Iterator_remove_ex1 {

    public static void main(String[] args) {
        // List is a subinterface of Collection.
        List<Integer> years = new ArrayList<Integer>();

        years.add(1998);
        years.add(1995);
        years.add(2000);
        years.add(2006);
        years.add(2021);
        
        Iterator<Integer> iterator = years.iterator();
        
        while(iterator.hasNext()) {
            Integer current = iterator.next();
            
            if(current % 2 ==0) {
                iterator.remove(); // Remove current element.
            }
        }
        // After remove all even numbers:
        for(Integer year: years)  {
            System.out.println(year);
        }
    }
}
Output:
1995
2021
Ein Beispiel über eine Collection, deren Iteratordie Aktion Iterator.remove() nicht unterstützt.
Iterator_remove_ex2.java
package org.o7planning.iterator.ex;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Iterator_remove_ex2 {

    public static void main(String[] args) {
        // Fixed-size List.
        // Its Iterator does not support remove() operation.
        List<Integer> years = Arrays.asList(1998, 1995, 2000, 2006, 2021);
        
        Iterator<Integer> iterator = years.iterator();
        
        while(iterator.hasNext()) {
            Integer current = iterator.next();
            
            if(current % 2 ==0) {
                iterator.remove(); // UnsupportedOperationException!!
            }
        }
        // After remove all even numbers:
        for(Integer year: years)  {
            System.out.println(year);
        }
    }
}
Output:
Exception in thread "main" java.lang.UnsupportedOperationException: remove
    at java.base/java.util.Iterator.remove(Iterator.java:102)
    at org.o7planning.iterator.ex.Iterator_remove_ex2.main(Iterator_remove_ex2.java:20)

4. forEachRemaining(Consumer)

Führt die angegebene Aktion für jedes restlichen Element aus, bis alle Elemente verarbeitet wurden oder die Aktion eine Ausnahme auslöst.
public default void forEachRemaining(Consumer<? super E> action)
Zum Beispiel:
Iterator_forEachRemaining.java
package org.o7planning.iterator.ex;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Iterator_forEachRemaining {

    public static void main(String[] args) {
        // Set is a subinterface of Collection.
        Set<String> flowers = new HashSet<String>();

        flowers.add("Tulip");
        flowers.add("Daffodil");
        flowers.add("Poppy");
        flowers.add("Sunflower");
        flowers.add("Bluebell");
        
        // Note: Iterator doesn't guarantee iteration order
        Iterator<String> iterator = flowers.iterator();
        
        String flower1 = iterator.next();
        String flower2 = iterator.next();
        
        System.out.println("Flower 1: " + flower1);
        System.out.println("Flower 2: " + flower2);
        
        System.out.println();
        
        iterator.forEachRemaining(flower -> System.out.println(flower));
    }
}
Output:
Flower 1: Poppy
Flower 2: Tulip

Daffodil
Sunflower
Bluebell

5. ListIterator

ListIterator ist eine Unter-Interface von Iterator. Das ist einer der Möglichkeiten, die Elemente einer List zu durchlaufen. Im Gegensatz zu Iterator unterstützt ListIterator das Durchlaufen von Elementen sowohl in Vorwärts- als auch in Rückwärtsrichtung. ListIterator unterstützt auch das Entfernen, Aktualisieren oder Einfügen eines Element bei der Iteration.