Pascal4eg / Java

 Java | Фишки и трюки

for-each для собственного класса

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

public class IterableExample {
    public static void main (String[] args) {
        Row row = new Row(List.of(new Cell("text1"), new Cell("text2"), new Cell("text3")));
        for (Cell cell : row) {
            System.out.println(cell.text);
        }
    }

    static class Row implements Iterable<Cell> {
        private List<Cell> cells;

        public Row(List<Cell> cells) {
            this.cells = cells;
        }

        @Override
        public Iterator<Cell> iterator() {
            // в данном случаем можно было просто отдать cells.iterator();
            return new Iterator<>() {
                private int index = 0;

                @Override
                public boolean hasNext() {
                    return index < cells.size();
                }

                @Override
                public Cell next() {
                    return cells.get(index++);
                }
            };
        }
    }

    static class Cell {
        String text;
        public Cell(String text) {
            this.text = text;
        }
    }
}

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

В результате можно использовать for-each для перебора элементов этого класса, как если бы это был обычный массив или коллекция.

Вы можете адаптировать этот пример для своих собственных классов, реализуя интерфейс Iterable и предоставив соответствующий итератор, чтобы использовать for-each для вашего класса.