Какова роль интерфейса Iterable в Java?

«Какова роль интерфейса Iterable в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интерфейс Iterable<T> — это фундаментальный контракт в Java, который позволяет объектам быть источником данных для цикла for-each. Он объявляет единственный метод iterator(), возвращающий объект Iterator<T> для последовательного обхода элементов.

Ключевые преимущества:

  1. Универсальный доступ: Любой класс, реализующий Iterable, автоматически совместим с улучшенным циклом for.
  2. Ленивая итерация: Позволяет реализовать обход данных по требованию (например, чтение строк из файла или записей из базы данных), не загружая все элементы в память сразу.
  3. Стандартизация: Все основные коллекции из Java Collections Framework (List, Set, Queue) реализуют этот интерфейс.

Пример использования:

List<String> names = List.of("Alice", "Bob", "Charlie");
// Цикл for-each работает, потому что List реализует Iterable
for (String name : names) {
    System.out.println(name);
}

Реализация кастомного Iterable:

class Range implements Iterable<Integer> {
    private final int start;
    private final int end;

    public Range(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<>() {
            private int current = start;
            @Override
            public boolean hasNext() { return current < end; }
            @Override
            public Integer next() { return current++; }
        };
    }
}
// Использование
for (int num : new Range(1, 5)) {
    System.out.print(num + " "); // Вывод: 1 2 3 4
}