Можно ли использовать произвольный класс в цикле for-each в Java?

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

Ответ

Да, можно, если класс реализует интерфейс java.lang.Iterable<T>. Цикл for-each работает с любым объектом, предоставляющим итератор.

Требование: Класс должен реализовать метод iterator(), возвращающий объект, реализующий java.util.Iterator<T>.

Пример реализации:

import java.util.Iterator;
import java.util.List;

class CustomContainer implements Iterable<String> {
    private List<String> items = List.of("First", "Second", "Third");

    @Override
    public Iterator<String> iterator() {
        // Возвращаем итератор по внутренней коллекции
        return items.iterator();
    }
}

public class Main {
    public static void main(String[] args) {
        CustomContainer container = new CustomContainer();
        for (String element : container) {
            System.out.println(element); // Выведет: First, Second, Third
        }
    }
}

Почему это работает: Цикл for (Type var : iterable) на этапе компиляции преобразуется в вызов метода iterator() и использование методов hasNext()/next() возвращённого итератора.