Iterable
Интерфейс всего, что можно обойти циклом for-each.
Доступно с: Java 1.5
Синтаксис
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action);
}Примеры
Цикл for-each и метод forEach():
void main() {
List<String> langs = List.of("Java", "Kotlin", "Scala");
for (String lang : langs) {
IO.println(lang);
}
langs.forEach(lang -> IO.println(lang.length()));
}Результат:
Java
Kotlin
Scala
4
6
5Свой класс в цикле for-each:
record Countdown(int from) implements Iterable<Integer> {
public Iterator<Integer> iterator() {
return new Iterator<>() {
int current = from;
public boolean hasNext() { return current > 0; }
public Integer next() { return current--; }
};
}
}
void main() {
for (int n : new Countdown(3)) {
IO.println(n);
}
}Результат:
3
2
1Примечания
Цикл for (T x : collection) работает с массивами и с любым объектом Iterable: всеми коллекциями, кроме Map (у словаря обходят entrySet(), keySet() или values()). Удалять элементы коллекции внутри такого цикла нельзя — будет ConcurrentModificationException; используйте removeIf() или Iterator.remove().
См. также
- Iterator — Объект, который по одному выдаёт элементы коллекции.
- Map.forEach() — Выполняет действие для каждой пары словаря.
- Stream.forEach() — Выполняет действие для каждого элемента потока (завершающая операция).
Вопросы и ответы по теме
В учебнике
- Обход коллекций — Как перебрать коллекцию в Java: цикл for-each, индексы, forEach с лямбдой, обход словаря, Iterator и removeIf.