JavaRush /Java блог /Java Developer /Цикл for-each
Автор
Артем Divertitto
Senior Android-разработчик в United Tech

Цикл for-each

Стаття з групи Java Developer

Що таке foreach у Java?

For-each – це різновид циклу for, який використовується, коли потрібно обробити всі елементи масиву або колекції. "For each" з англійської так і перекладається – "для кожного". Власне, саме словосполучення foreach у цьому циклі не використовується. Його синтаксис такий:

for (type itVar : array) 
{ 
    Блок операторів;
}
Де type – тип ітераційної змінної (збігається з типом даних у масиві!), itVar – її ім'я, array – масив (тут також може бути інша структура даних, якась колекція, наприклад, ArrayList), тобто об'єкт, за яким виконується цикл. Як ви бачите, лічильник у такій конструкції не застосовується, ітераційна змінна перебирає елементи масиву або колекції, а не значення індексу. Під час виконання такого циклу, ітераційній змінній послідовно присвоюється значення кожного елемента масиву або колекції, після чого виконується вказаний блок операторів (або оператор).

Крім циклу for-each у Java також є метод forEach(). Про нього можна почитати, наприклад, у статті "Досить писати цикли! Топ-10 найкращих методів для роботи з колекціями в Java 8"

Увага: цикл for-each можна застосувати до масивів і будь-яких класів, які реалізують інтерфейс java.lang.Iterable. Еквівалентом коду вище буде такий цикл for:

for (int i=0; i<array.length; i++) 
{ 
    
    Блок операторів; 
}

Приклад використання Java foreach

Створимо масив з оцінок учня. Потім за допомогою for-each роздрукуємо всі оцінки, виведемо середню оцінку і знайдемо максимальну з них.

public class ForEachTest {
    
//метод, який роздруковує всі оцінки     
public static void printAllGrades(int[] grades) {
        System.out.print("|");
        for (int num : grades) {

            System.out.print(num + "|");
        }
        System.out.println();
    }

//метод, у якому виводиться середня оцінка 
    
public static double midGrade(int[] numbers) {
        int grade = 0;

        for (int num : numbers) {
            grade = num + grade;
        }
        return ((double) grade / numbers.length);

    }
//метод, у якому обчислюється найкраща (максимальна) оцінка 
    public static int bestGrade(int[] numbers) {
        int maxGrade = numbers[0];

        for (int num : numbers) {
            if (num > maxGrade) {
                maxGrade = num;
            }
        }
        return maxGrade;
    }

public static void main(String[] args) {
      
//масив оцінок 
int[] grades = {5, 10, 7, 8, 9, 9, 10, 12};

        
  int highest_marks = bestGrade(grades);
        System.out.print("Усі оцінки: ");
        printAllGrades(grades);
        System.out.println("Найвища оцінка - " + highest_marks);
        System.out.println("Середній бал становить " + midGrade(grades));
    }

}
Виведення програми:
All the grades: |5|10|7|8|9|9|10|12| The highest grade is 12 The average grade is 8.75
А тепер давайте подивимося, який би вигляд мав метод роздрукування всіх оцінок, виконаний за допомогою звичайного циклу for:

public static void printAllGrades(int[] grades) {
        System.out.print("|");
        for (int i = 0; i < grades.length; i++) {

            System.out.print(grades[i] + "|");
        }
        System.out.println();
    }
Якщо викликати цей метод із методу main, ми отримаємо результат:
All the grades: |5|10|7|8|9|9|10|12|

Приклад використання циклу for-each з колекціями

Створимо колекцію з імен і виведемо всі імена на екран.

List<String> names = new ArrayList<>();
        names.add("Snoopy");
        names.add("Charlie");
        names.add("Linus");
        names.add("Shroeder");
        names.add("Woodstock");

        for(String name : names){
            System.out.println(name);
        }

Обмеження циклу for-each

Компактна форма for-each вважається більш читабельною, ніж for, і правилом хорошого тону вважається використання саме for-each там, де це можливо. Однак for-each – менш універсальна конструкція, ніж звичайний for. Наведемо кілька простих випадків, де скористатися for-each не вийде зовсім або вийде, але насилу.
  1. Якщо ви хочете пройти циклом з кінця на початок. Тобто прямого for-each аналога наступному коду немає:

    
    for (int i = array.length - 1; i >= 0; i--) 
    {
          System.out.println(array[i]);
    }
    

  2. For-each не підходить, якщо ви хочете внести зміни в масив. Наприклад, не вийде організувати сортування масиву, не міняючи його елементи місцями. Або ось, у наступному коді зміниться не елемент масиву, а тільки ітераційна змінна:

    
    for (int itVar : array) 
    {
        itVar = itVar++; 
    }
    
    <

    /li>
  3. Якщо ви шукаєте елемент у масиві і вам потрібно повернути (або передати далі) індекс шуканого елемента, краще скористатися звичайним циклом for.

Корисне відео про for-each, підготовлене учнем JavaRush

Цикли в курсі JavaRush

На JavaRush до використання циклів на практиці приступають на 4 рівні квесту Java Syntax. Там їм присвячено кілька лекцій, а також безліч завдань різного рівня для закріплення навичок роботи з ними. Взагалі, нікуди ви від них не дінетесь, цикли – одна з найважливіших конструкцій у програмуванні.

Докладніше про for-each і цикли:

  1. For і For-Each Loop: розповідь про те, як я ітерувався, ітерувався, та й не виітерувався – хороша детальна стаття про цикли for і for-each в Java. Розрахована на підготовленого читача (приблизно від 10 рівня JavaRush і вище).
  2. Оператор While. Стаття присвячена найпростішому циклу while, з якого починається знайомство з циклами на JavaRush.
  3. Досить писати цикли! Топ-10 найкращих методів для роботи з колекціями в Java 8. З цієї статті студент JavaRush, який уже пройшов половину курсу або більше, дізнається багато цікавого про роботу з колекціями.
Коментарі (1)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Іван Рівень 70 Expert
13 травня 2023
Досить дохідливо розписана стаття. Подяка автору!