betacode

Руководство Java Iterator

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

1. Iterator

Iterator - это один из способов обхода (traverse) элементов Collection. Ниже приведены характеристики Iterator:
  • Iterator не гарантирует порядок итераций элементов.
  • Iterator может разрешить удаление элементов из Collection во время итерации, что зависит от типа Collection.
Иерархия подинтерфейсов of Iterator:
Причина, по которой вы можете перемещаться (traverse) по элементам of Collection с помощью Iterator, заключается в том, что Collection расширяется из интерфейса Iterable.
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

С помощью объекта Collection можно создать Iterator методом Collection.iterator(), а затем обходить элементы of Iterator с помощью метода next().
Например:
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()

При обходе элементов of Collection с помощью Iterator, вы можете удалить текущий элемент из Collection. Метод Iterator.remove() позволяет это сделать. Однако не все Iterator поддерживают эту операцию, это зависит от типа Collection. Если он не поддерживается, будет выдано исключение UnsupportedOperationException.
// Optional Operation
public default void remove()
Например: ArrayList<Integer> содержит числа. Мы переберем его элементы и удалим текущий, если он четный.
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
Пример о Collection, Iterator которой не поддерживает операцию Iterator.remove():
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)

Выполняем данное действие для каждого оставшегося элемента до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение.
public default void forEachRemaining(Consumer<? super E> action)
Например:
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 - это подинтерфейс of Iterator. Это один из способов обхода элементов List. В отличие от Iterator, ListIterator поддерживает перемещение элементов как в прямом, так и в обратном направлениях. ListIterator также поддерживает удаление, обновление или вставку элемента во время итерации.