Skip to main content

У чому різниця між зовнішнім і внутрішнім ітератором?

Зовнішній і внутрішній ітератори відрізняються тим, хто керує процесом обходу колекції - клієнт чи сама колекція.


1. Зовнішній ітератор (External Iterator)

Суть

Клієнт сам керує ходом ітерації - вручну запитує елементи в ітератора. Це найпоширеніший варіант (наприклад, Iterator у Java, for...of у Python).

Приклад (Java)

java
Iterator<String> it = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); }

Клієнт вирішує, коли переходити до наступного елемента, коли зупинитися, і що робити між кроками.

Переваги

  • Повний контроль над процесом обходу.
  • Можна перервати, пропустити елементи, об'єднувати декілька ітерацій.
  • Легко реалізувати вкладені обходи або фільтрацію в коді.

Недоліки

  • Клієнт змушений сам писати цикл і стежити за станом ітератора.
  • Можливі помилки (наприклад, виклик next() без перевірки hasNext()).

2. Внутрішній ітератор (Internal Iterator)

Суть

Колекція сама керує обходом - клієнт просто передає дію (функцію, лямбду), яку потрібно виконати для кожного елемента.

Приклад (Java)

java
list.forEach(item -> System.out.println(item));

Тут колекція сама перебирає всі елементи і викликає передану функцію.

Переваги

  • Код чистіший - немає ручних циклів.
  • Безпечніше: клієнт не може порушити послідовність обходу.
  • Підходить для паралельних і потокових API (наприклад, stream().forEach() у Java).

Недоліки

  • Менше контролю: не можна перервати обхід або змішати декілька ітерацій.
  • Неможливо вкласти один внутрішній ітератор в інший без додаткових хитрощів.

Порівняння

ХарактеристикаЗовнішній ітераторВнутрішній ітератор
Хто керує ітерацієюКлієнтКолекція
ГнучкістьВисокаНизька
Простота використанняНижчаВища
Можливість перериванняТакОбмежена
Приклад у JavaIterator, while (it.hasNext())forEach, Stream.forEach()

Висновок

  • Зовнішній ітератор - вибір, коли потрібні контроль і гнучкість (наприклад, умовна обробка, зупинка).
  • Внутрішній ітератор - коли важлива простота і безпека (наприклад, обробка всіх елементів підряд).

Підсумок:

Зовнішній ітератор "видає елементи на вимогу клієнта", а внутрішній - "сам керує обходом і лише викликає клієнтський код".

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.