Руководство по Java Core. Коллекции. Iterator.

Во время разработки приложений мы часто сталкиваемся с необходимостью получить доступ ко всем элементами коллекции. Например, вывести на экран эти элементы.
Самым простым и эффективным способом сделать это, является использование итератора (iterator). Итератор – это объект, который реализовывает интерфейсы Iterator, либо ListIterator.

Iterator позволяет нам получить доступ ко всем элементам коллекции и удалять те из них, которые необходимо. ListIterator является наследником Iterator и позволяет нам “пробежаться” по коллекции в обоих направлениях. ListIterator также позволяет нам изменять элементы.

Для того чтобы использовать итератор, нам прежде всего необходимо получить его. Для этого мы должны использовать метод iterator().

Итератор имеет такие методы:

  • boolean hasNext()
    Этот метод проверяет, есть ли в коллекции следующий элемент. Если есть, то метод возвращает true, если нет – false.
  • Object next()
    Этот метод возвращает следующий элемент коллекции. Если элемент не обнаружен, то метод “бросает” NoSuchElementException.
  • void remove()
    Этот метод удаляет текущий элемент. Важный момент заключается в том, что сначала этот элемент необходимо получить с помощью метода next(), если мы вызовем метод remove() до метода next(), то мы получим IllegalStateException.

ListIterator имеет больший набор методов:

  • void add(Object obj)
    Этот метод добавляет элемент в коллекцию на следующую позицию после элемента, полученного с помощью метода next().
  • boolean hasNext()
    Этот метод проверяет, есть ли в коллекции следующий элемент. Если есть, то метод возвращает true, если нет – false.
  • boolean hasPreviuos()
    Этот метод проверяет, есть ли в коллекции предыдущий элемент. Если есть, то метод возвращает true, если нет – false.
  • Object next()
    Этот метод возвращает следующий элемент коллекции. Если элемент не обнаружен, то метод “бросает” NoSuchElementException.
  • Object previous()
    Этот метод возвращает предыдущий элемент коллекции. Если элемент не обнаружен, то метод “бросает” NoSuchElementException.
  • int nextIndex()
    Этот метод возвращает индекс следующего элемента. Если в коллекции отсутствует следующий элемент – возвращается размер коллекции.
  • int previousIndex()
    Этот метод возвращает индекс предыдущего элемента. Если в коллекции отсутствует предыдущий элемент – возвращает значение -1.
  • void set(Object obj)
    Этот метод присваивает текущему элементу значение, которое передано в качестве параметра метода.
  • void remove()
    Этот метод удаляет текущий элемент. Важный момент заключается в том, что сначала этот элемент необходимо получить с помощью метода next()либо с помощью метода previous(), если мы вызовем метод remove() до метода next() или метода previous(), то мы получим IllegalStateException.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

Пример:

Класс IteratorDemo


import java.util.*;

public class IteratorDemo {
    public static void main(String[] args) {
        List arrayList = new ArrayList<>();

        System.out.println("Adding elements into arrayList...");

        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(5);

        System.out.println("Initial arrayList content (using Iterator):");
        Iterator iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println("\n========================\n");

        System.out.println("Updating elements using ListIterator...");

        ListIterator listIterator = arrayList.listIterator();

        while (listIterator.hasNext()) {
            Integer element = (Integer) listIterator.next();
            listIterator.set(element * 10);
        }

        System.out.println("\n========================\n");

        System.out.println("Final arrayList content (using iterator):");
        iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }

        System.out.println("\n========================\n");

        System.out.println("Final arrayList content (using listIterator):");
        while (listIterator.hasPrevious()) {
            System.out.print(listIterator.previous() + " ");
        }

        System.out.println("\n========================\n");
    }
}

В результате работы программы мы получим следующий результат:


/*Some System Messages*/

Adding elements into arrayList...
Initial arrayList content (using Iterator):
1 2 3 4 5 
========================

Updating elements using ListIterator...

========================

Final arrayList content (using iterator):
10 20 30 40 50 
========================

Final arrayList content (using listIterator):
50 40 30 20 10 
========================

В этом разделе мы изучили основы интерфейсов Iterator и ListIterator, и рассмотрели пример простого приложения с его использованием.