Ответ
Чтобы объекты класса можно было использовать в цикле for-each, класс должен реализовать интерфейс Iterable<T>.
Требования:
- Реализовать единственный метод
Iterable<T>.iterator(). - Метод
iterator()должен возвращать объект, реализующий интерфейсIterator<T>. Iterator<T>должен предоставлять реализации методовhasNext()(проверка наличия следующего элемента) иnext()(получение следующего элемента).
Пример реализации:
import java.util.Iterator;
import java.util.NoSuchElementException;
public class SimpleCollection<T> implements Iterable<T> {
private final T[] elements;
public SimpleCollection(T[] elements) {
this.elements = elements.clone();
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < elements.length;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return elements[currentIndex++];
}
};
}
// Использование в for-each
public static void main(String[] args) {
SimpleCollection<String> collection = new SimpleCollection<>(new String[]{"A", "B", "C"});
for (String item : collection) { // Цикл for-each работает!
System.out.println(item);
}
}
}
Почему Iterable, а не Iterator? Интерфейс Iterable декларирует, что класс может предоставить итератор, что позволяет одному классу иметь несколько независимых итераторов и является более абстрактным и гибким подходом.