Итератор — это объект, который позволяет программисту пробежать по элементам коллекции. «Ну и что?» — скажут некоторые — «Я могу это сделать с помощью обычного цикла!».
Да, действительно, большинство стандартных коллекций из пакета java.util предоставляют возможность выборки элемента по его индексу, вот так:
List list = new ArrayList();
list.add("One");
list.add("Two");
list.add("Three");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
Но таким образом можно поступить далеко не со всеми коллекциями. Возьмём, к примеру Set.
Вот тут то нам и придёт на помощь итератор. Все коллекции из java.util реализуют интерфейс Collection, который, в свою очередь, расширяет интерфейс Iterable. Вот оно, наше решение! В интерфейсе Iterable описан только один метод
Iterator iterator()
Он и возвращает т.н. итератор, т.е. объект, который поочерёдно возвращает все элементы коллекции. Вот так это выглядит в коде
Set set = new HashSet();
set.add("One");
set.add("Two");
set.add("Three");
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
Вот так всё просто. Рассмотрим подробнее методы возвращаемого класса Iterator.
boolean hasNext() — метод возвращает true, если в коллекции ещё остались элементы и false, если достигнут конец коллекции.
E next() — метод возвращает текущий элемент. Т.к. итератор является параметризованным классом, то этот метод нам будет возвращть не Object, а сразу тот тип, который нам нужен.
Вопрос 1.
Зачем нужны итераторы?
Вопрос 2.
Как можно упростить код в последнем примере?