Що таке foreach у Java?
For-each – це різновид циклу for, який використовується, коли потрібно обробити всі елементи масиву або колекції. "For each" з англійської так і перекладається – "для кожного". Власне, саме словосполучення foreach у цьому циклі не використовується. Його синтаксис такий:
for (type itVar : array)
{
Блок операторів;
}
Де type – тип ітераційної змінної (збігається з типом даних у масиві!), itVar – її ім'я, array – масив (тут також може бути інша структура даних, якась колекція, наприклад, ArrayList), тобто об'єкт, за яким виконується цикл. Як ви бачите, лічильник у такій конструкції не застосовується, ітераційна змінна перебирає елементи масиву або колекції, а не значення індексу.
Під час виконання такого циклу, ітераційній змінній послідовно присвоюється значення кожного елемента масиву або колекції, після чого виконується вказаний блок операторів (або оператор).Крім циклу for-each у Java також є метод forEach(). Про нього можна почитати, наприклад, у статті "Досить писати цикли! Топ-10 найкращих методів для роботи з колекціями в Java 8" |
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 не вийде зовсім або вийде, але насилу.Якщо ви хочете пройти циклом з кінця на початок. Тобто прямого for-each аналога наступному коду немає:
for (int i = array.length - 1; i >= 0; i--) { System.out.println(array[i]); }
For-each не підходить, якщо ви хочете внести зміни в масив. Наприклад, не вийде організувати сортування масиву, не міняючи його елементи місцями. Або ось, у наступному коді зміниться не елемент масиву, а тільки ітераційна змінна:
</li>for (int itVar : array) { itVar = itVar++; }
Якщо ви шукаєте елемент у масиві і вам потрібно повернути (або передати далі) індекс шуканого елемента, краще скористатися звичайним циклом for.
Корисне відео про for-each, підготовлене учнем JavaRush
Цикли в курсі JavaRushНа JavaRush до використання циклів на практиці приступають на 4 рівні квесту Java Syntax. Там їм присвячено кілька лекцій, а також безліч завдань різного рівня для закріплення навичок роботи з ними. Взагалі, нікуди ви від них не дінетесь, цикли – одна з найважливіших конструкцій у програмуванні. |
Докладніше про for-each і цикли:
- For і For-Each Loop: розповідь про те, як я ітерувався, ітерувався, та й не виітерувався – хороша детальна стаття про цикли for і for-each в Java. Розрахована на підготовленого читача (приблизно від 10 рівня JavaRush і вище).
- Оператор While. Стаття присвячена найпростішому циклу while, з якого починається знайомство з циклами на JavaRush.
- Досить писати цикли! Топ-10 найкращих методів для роботи з колекціями в Java 8. З цієї статті студент JavaRush, який уже пройшов половину курсу або більше, дізнається багато цікавого про роботу з колекціями.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ