У чому різниця між зовнішнім і внутрішнім ітератором?
Зовнішній і внутрішній ітератори відрізняються тим, хто керує процесом обходу колекції - клієнт чи сама колекція.
1. Зовнішній ітератор (External Iterator)
Суть
Клієнт сам керує ходом ітерації - вручну запитує елементи в ітератора.
Це найпоширеніший варіант (наприклад, Iterator у Java, for...of у Python).
Приклад (Java)
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}Клієнт вирішує, коли переходити до наступного елемента, коли зупинитися, і що робити між кроками.
Переваги
- Повний контроль над процесом обходу.
- Можна перервати, пропустити елементи, об'єднувати декілька ітерацій.
- Легко реалізувати вкладені обходи або фільтрацію в коді.
Недоліки
- Клієнт змушений сам писати цикл і стежити за станом ітератора.
- Можливі помилки (наприклад, виклик
next()без перевіркиhasNext()).
2. Внутрішній ітератор (Internal Iterator)
Суть
Колекція сама керує обходом - клієнт просто передає дію (функцію, лямбду), яку потрібно виконати для кожного елемента.
Приклад (Java)
list.forEach(item -> System.out.println(item));Тут колекція сама перебирає всі елементи і викликає передану функцію.
Переваги
- Код чистіший - немає ручних циклів.
- Безпечніше: клієнт не може порушити послідовність обходу.
- Підходить для паралельних і потокових API (наприклад,
stream().forEach()у Java).
Недоліки
- Менше контролю: не можна перервати обхід або змішати декілька ітерацій.
- Неможливо вкласти один внутрішній ітератор в інший без додаткових хитрощів.
Порівняння
| Характеристика | Зовнішній ітератор | Внутрішній ітератор |
|---|---|---|
| Хто керує ітерацією | Клієнт | Колекція |
| Гнучкість | Висока | Низька |
| Простота використання | Нижча | Вища |
| Можливість переривання | Так | Обмежена |
| Приклад у Java | Iterator, while (it.hasNext()) | forEach, Stream.forEach() |
Висновок
- Зовнішній ітератор - вибір, коли потрібні контроль і гнучкість (наприклад, умовна обробка, зупинка).
- Внутрішній ітератор - коли важлива простота і безпека (наприклад, обробка всіх елементів підряд).
Підсумок:
Зовнішній ітератор "видає елементи на вимогу клієнта", а внутрішній - "сам керує обходом і лише викликає клієнтський код".
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.