Начини за итерация над списък в Java

1. Въведение

Итерацията над елементите на списък е една от най-често срещаните задачи в програмата.

В този урок ще разгледаме различни начини за това в Java. Ще се съсредоточим върху итерирането на списъка по ред, макар че и обратното е просто.

2. за Loop

Първо, нека да разгледаме някои за опции за цикъл.

Нека започнем с дефиниране на списък с държави за нашите примери:

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

2.1. Основно за Loop

Най-често срещаният израз за контрол на потока за итерация е основният за цикъл.

В продължение на линия определя три вида отчети разделени с запетая. Първият оператор е операторът за инициализация. Вторият определя условието за прекратяване. Последното изявление е клаузата за актуализация.

Тук просто използваме целочислена променлива като индекс:

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

При инициализацията трябва да декларираме целочислена променлива, за да посочим началната точка. Тази променлива обикновено действа като индекс на списъка.

Условието за прекратяване е израз, който след оценяването връща булева стойност, след като този израз оцени като фалшив, цикълът завършва.

Клаузата за актуализация се използва за промяна на текущото състояние на променливата на индекса, увеличаване или намаляване до точката на прекратяване.

2.2. Подобрено за Loop

Подобреният цикъл for е проста структура, която ни позволява да посещаваме всеки елемент от списък. Той е подобен на основния цикъл for, но е по-четлив и компактен. Следователно, е една от най-често използваните форми за преминаване през списък.

Забележете, че подобреният цикъл for е по-прост от основния цикъл for :

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

3. Итератори

Един Итераторът е модел дизайн, който ни предлага стандартен интерфейс, за да измине структура от данни, без да се налага да се притеснявате за вътрешния представителство.

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

Следователно структурата може да бъде двоично дърво или двойно свързан списък, тъй като Итераторът ни абстрахира от начина на извършване на обхода. По този начин можем лесно да заменим структурите от данни в нашия код без неприятни проблеми.

3.1. Итератор

В Java моделът Iterator се отразява в класа java.util.Iterator . Той се използва широко в Java Collection . Има два ключови метода в итератор , методите hasNext () и next () .

Тук демонстрираме използването и на двете:

Iterator countriesIterator = countries.iterator(); while(countriesIterator.hasNext()) { System.out.println(countriesIterator.next()); }

На hasNext () метод на проверките, ако има някакви елементи, които остават в списъка .

В следващата () методът връща следващия елемент в итерация .

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 ()

Тъй като Java 8, можем да използваме метода forEach () , за да прегледаме елементите на списък . Този метод е дефиниран в интерфейса Iterable и може да приема ламбда изрази като параметър.

Синтаксисът е доста прост:

countries.forEach(System.out::println);

Преди функцията forEach всички итератори в Java са били активни, тоест те са включвали цикъл за известно време, който е обхождал събирането на данни, докато е изпълнено определено условие.

С въвеждането на 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.