Итератор — это поведенческий паттерн проектирования и одновременно интерфейс в Java/Kotlin, который предоставляет стандартный способ последовательного доступа к элементам коллекции без раскрытия её внутренней структуры.
Итератор реализует принцип единственной ответственности:
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() { ... }
}
List<String> androidVersions = Arrays.asList("Pie", "Q", "R");
Iterator<String> it = androidVersions.iterator();
while(it.hasNext()) {
String version = it.next();
Log.d("TAG", version);
}
val androidVersions = listOf("Pie", "Q", "R")
val iterator = androidVersions.iterator()
while(iterator.hasNext()) {
val version = iterator.next()
println(version)
}
ListIterator<String> listIt = androidVersions.listIterator();
listIt.previous(); // Возвращает предыдущий элемент
val mutableIterator = mutableListOf(1, 2, 3).iterator()
mutableIterator.remove() // Удаляет текущий элемент
Типичная реализация итератора для ArrayList:
public Iterator<E> iterator() {
return new Itr(); // Внутренний класс
}
private class Itr implements Iterator<E> {
int cursor; // Текущая позиция
int lastRet = -1; // Последний возвращенный индекс
public boolean hasNext() {
return cursor != size;
}
public E next() {
checkForComodification();
int i = cursor;
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
}
Возникает при изменении коллекции во время итерации:
val list = mutableListOf(1, 2, 3)
val iter = list.iterator()
while(iter.hasNext()) {
val item = iter.next()
list.remove(item) // Выбросит исключение!
}
Правильное решение:
iter.remove() // Используем метод итератора
Iterator
вместо for-each
Iterator
для ленивой загрузкиforEach
, map
и т.д.)Итератор — это мощный инструмент для безопасного и эффективного обхода коллекций, который предоставляет единый интерфейс работы с разными структурами данных и является фундаментальной частью Java/Kotlin Collections Framework.