Способы перебора списка в Java

Способы перебора списка в Java

1. Вступление

Перебор элементов списка - одна из самых распространенных задач в программе.

В этом руководстве мы рассмотрим различные способы сделать это на Java. Мы сосредоточимся на итерации по списку по порядку, хотя перейти наin reverse тоже просто.

2. for Цикл

Во-первых, давайте рассмотрим несколько вариантовfor loop.

Давайте начнем с определения списка стран для наших примеров:

List countries = Arrays.asList("Germany", "Panama", "Australia");

2.1. Базовый циклfor

Наиболее распространенным оператором управления потоком для итераций является основной циклfor.

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

Здесь мы просто используем целочисленную переменную в качестве индекса:

for (int i = 0; i < countries.size(); i++) {
    System.out.println(countries.get(i));
}

При инициализации мы должны объявить целочисленную переменную, чтобы указать начальную точку. Эта переменная обычно действует как индекс списка.

Условие завершения - это выражение, которое после оценки возвращает логическое значение, как только это выражение оценивается какfalse , цикл завершается.

Предложение обновления используется для изменения текущего состояния индексной переменной, увеличения или уменьшения его до момента завершения.

2.2. Улучшенный циклfor

Расширенный циклfor - это простая структура, которая позволяет нам посещать каждый элемент списка. Он похож на базовый цикл for, но более читабелен и компактен. Следовательно, это одна из наиболее часто используемых форм для обхода списка.

Обратите внимание, что расширенный циклfor проще, чем базовый циклfor:

for (String country : countries) {
    System.out.println(country);
}

3. итераторы

Iterator - это шаблон проектирования, который предлагает нам стандартный интерфейс для просмотра структуры данных, не беспокоясь о внутреннем представлении.

Этот способ обхода структур данных предлагает много преимуществ, среди которых мы можем подчеркнуть, что наш код не зависит от реализации.

Следовательно, структура может быть двоичным деревом или двусвязным списком, посколькуIterator абстрагирует нас от способа выполнения обхода. Таким образом, мы можем легко заменить структуры данных в нашем коде без неприятных проблем.

3.1. Iteratorс

В Java шаблонIterator отражается в классеjava.util.Iterator. Он широко используется в JavaCollections. ВIterator есть два ключевых метода:hasNext() иnext().

Здесь мы демонстрируем использование обоих:

Iterator countriesIterator = countries.iterator();

while(countriesIterator.hasNext()) {
    System.out.println(countriesIterator.next());
}

МетодhasNext()checks if there are any elements remaining in the list.

Методnext()returns the next element in the iteration.

3.2. ListIteratorс

ListIterator позволяет нам перемещаться по списку элементов в прямом или обратном порядке.

Прокрутка списка с помощьюListIterator вперед выполняется по механизму, аналогичному используемомуIterator. Таким образом, мы можем переместить итератор вперед с помощью методаnext(), а мы можем найти конец списка с помощью методаhasNext().

Как мы видим,ListIterator очень похож наIterator, который мы использовали ранее:

ListIterator listIterator = countries.listIterator();

while(listIterator.hasNext()) {
    System.out.println(listIterator.next());
}

4. forEach()с

4.1. Iterable.forEach()с

Since Java 8, we can use the forEach() method to iterate over the elements of a list. Этот метод определен в интерфейсе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() сStreams.

Наконец, весь код, использованный в этой статье, доступен в нашемGithub repo.