1. Введение
Перебор элементов списка — одна из самых распространенных задач в программе.
В этом руководстве мы рассмотрим различные способы сделать это в Java. Мы сосредоточимся на переборе списка по порядку, хотя и в обратном порядке тоже несложно.
2. для
цикла
Во-первых, давайте рассмотрим некоторые параметры цикла for
.
Мы начнем с определения списка стран для наших примеров:
List<String> countries = Arrays.asList("Germany", "Panama", "Australia");
2.1. Базовый цикл _
Наиболее распространенным оператором управления потоком для итерации является базовый цикл for
.
Цикл for
определяет три типа операторов, разделенных точкой с запятой. Первый оператор является оператором инициализации. Второй определяет условие завершения. Последнее утверждение — это предложение обновления.
Здесь мы просто используем целочисленную переменную в качестве индекса:
for (int i = 0; i < countries.size(); i++) {
System.out.println(countries.get(i));
}
При инициализации мы должны объявить целочисленную переменную, чтобы указать начальную точку. Эта переменная обычно действует как индекс списка.
Условие завершения — это выражение, которое возвращает логическое значение после оценки. Как только это выражение становится ложным,
цикл завершается.
Предложение update используется для изменения текущего состояния индексной переменной, увеличения или уменьшения его до точки завершения.
2.2. Улучшено для
цикла
Усовершенствованный цикл for
представляет собой простую структуру, которая позволяет нам обращаться к каждому элементу списка. Он похож на базовый цикл for, но более удобочитаем и компактен. Следовательно, это одна из наиболее часто используемых форм для обхода списка.
Обратите внимание, что расширенный цикл for
проще, чем базовый цикл for
:
for (String country : countries) {
System.out.println(country);
}
3. Итераторы
Итератор — это шаблон
проектирования, который предлагает нам стандартный интерфейс для обхода структуры данных, не беспокоясь о внутреннем представлении.
Этот способ обхода структур данных дает много преимуществ, среди которых мы можем подчеркнуть, что наш код не зависит от реализации.
Следовательно, структура может быть бинарным деревом или двусвязным списком, поскольку Итератор
абстрагирует нас от способа выполнения обхода. Таким образом, мы можем легко заменить структуры данных в нашем коде без неприятных проблем.
3.1. Итератор
В Java шаблон Iterator
отражен в классе java.util.Iterator
. Он широко используется в коллекциях
Java . В Iterator
есть два ключевых метода: hasNext()
и next()
.
Здесь мы продемонстрируем использование обоих:
Iterator<String> countriesIterator = countries.iterator();
while(countriesIterator.hasNext()) {
System.out.println(countriesIterator.next());
}
Метод hasNext()
проверяет , остались ли какие-либо элементы в списке .
Метод next()
возвращает следующий элемент итерации .
3.2. ListIterator
ListIterator позволяет нам перемещаться
по списку элементов в прямом или обратном порядке.
Прокрутка списка с помощью ListIterator
вперед следует механизму, аналогичному тому, который используется с помощью Iterator
. Таким образом, мы можем переместить итератор вперед с помощью метода next()
и найти конец списка с помощью метода hasNext()
.
Как мы видим, ListIterator
очень похож на итератор
, который мы использовали ранее:
ListIterator<String> listIterator = countries.listIterator();
while(listIterator.hasNext()) {
System.out.println(listIterator.next());
}
4. для каждого()
4.1. Итерабельный.для каждого()
Начиная с Java 8, мы можем использовать метод forEach()
для перебора элементов списка . Этот метод определен в интерфейсе Iterable
и может принимать лямбда-выражения в качестве параметра.
Синтаксис довольно прост:
countries.forEach(System.out::println);
До появления функции forEach
все итераторы в Java были активны, то есть они включали цикл for или while, который обходил сбор данных до тех пор, пока не выполнялось определенное условие.
С введением forEach
в качестве функции в интерфейсе Iterable все классы, реализующие
Iterable
, имеют добавленную функцию forEach .
4.2. Stream.forEach()
Мы также можем преобразовать набор значений в поток и получить доступ к таким операциям, как forEach()
, map()
и filter().
Здесь мы продемонстрируем типичное использование потоков:
countries.stream().forEach((c) -> System.out.println(c));
5. Вывод
В этой статье мы продемонстрировали различные способы перебора элементов списка с помощью Java API. Эти параметры включали цикл for
, расширенный цикл for
, Iterator
, ListIterator
и метод forEach()
(включенный в Java 8).
Затем мы узнали, как использовать метод forEach()
с потоками
.
Наконец, весь код, используемый в этой статье, доступен в нашем репозитории Github .