for
относится к низкоуровневым циклам. Он требует задания счетчика, правил его изменения и условия остановки. Было бы значительно удобнее обходить элементы коллекции напрямую, без счетчика. Многие языки программирования решают это введением специального вида цикла. В Java тоже есть такой: for-each.
String[] userNames = {"petya", "vasya", "evgeny"};
for (var name : userNames) {
System.out.println(name);
}
// => "petya"
// => "vasya"
// => "evgeny"
С for этот пример выглядит так:
for (var i = 0; i < userNames.length; i++) {
var name = userNames[i];
System.out.println(name);
}
https://replit.com/@hexlet/java-arrays-for-of-example#Main.java
Как видно из примера, код, использующий for-each, получается значительно чище, чем с использованием цикла for. for-each знает о том, как перебирать элементы и знает о том, когда они закончатся.
Этот цикл отлично подходит для задач агрегации:
class MyArrayUtils {
public static int calculateSum(int[] numbers) {
// Начальное значение суммы
var sum = 0;
for (var number : numbers) {
sum += number;
}
return sum;
}
}
int[] numbers = {3, 2, -10, 38, 0};
System.out.println(MyArrayUtils.calculateSum(numbers)); // => 33
С помощью for-each можно обходить строку посимвольно. В этом поможет метод toCharArray()
:
var greeting = "Hello";
for (var symbol : greeting.toCharArray()) {
System.out.println(symbol);
}
// => 'H'
// => 'e'
// => 'l'
// => 'l'
// => 'o'
Применимость
В большинстве задач, использующих цикл, предпочтительнее for-each . Иногда его бывает недостаточно, и требуется ручное управление обходом. В таких случаях можно возвращаться к использованию for. Например, когда нужно идти не по каждому элементу массива, а через один:
for (var i = 0; i < items.length; i += 2) {
// какой-то код
}
Иногда нужно обходить массив в обратном порядке. for-each здесь бессилен и снова нужен for:
for (var i = items.length - 1; i >= 0; i--) {
// какой-то код
}
Другие задачи вообще с массивами напрямую не связаны. К последним относятся ситуации, когда нужно перебирать числа в определенном диапазоне. В этом случае нет массива, по которому можно было бы пройтись с помощью for-each.
for (var i = 5; i < 10; i++) {
// какой-то код
}
Ну и наконец, встречаются задачи, в которых нужно во время обхода менять исходный массив:
for (var i = 0; i < items.length; i++) {
items[i] = /* что-то делаем */
}
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.