Руководство по Java 8 forEach
В этом руководстве мы увидим, как использовать forEach с коллекциями, какой аргумент он принимает и чем этот цикл отличается от расширенного цикла for .
Если вам нужно освежить некоторые концепции Java 8, наша подборка статей может помочь.
2. Основы forEach
В Java интерфейс Collection имеет Iterable в качестве суперинтерфейса. И этот интерфейс имеет новый API, начиная с Java 8:
Проще говоря, в Javadoc forEach говорится , что он «выполняет заданное действие для каждого элемента Iterable до тех пор, пока все элементы не будут обработаны или пока действие не вызовет исключение».
Итак, с помощью forEach мы можем перебирать коллекцию и выполнять заданное действие над каждым элементом, как и любой другой Iterator .
Например, рассмотрим версию цикла for для итерации и печати коллекции строк : «
Мы можем написать это, используя forEach :
3. Использование метода forEach
Мы используем forEach для перебора коллекции и выполнения определенного действия над каждым элементом. Выполняемое действие содержится в классе, реализующем интерфейс Consumer , и передается forEach в качестве аргумента.
Интерфейс Consumer — это функциональный интерфейс (интерфейс с одним абстрактным методом). Он принимает ввод и не возвращает никакого результата.
Поэтому любая реализация, например, потребитель, который просто печатает String :
можно передать forEach в качестве аргумента:
Но это не единственный способ создать действие через потребителя и использовать forEach API.
Давайте рассмотрим три наиболее популярных способа использования метода forEach .
3.1. Реализация анонимного потребителя
Мы можем создать экземпляр реализации интерфейса Consumer , используя анонимный класс, а затем применить его в качестве аргумента к методу forEach :
Это хорошо работает. Но если мы проанализируем пример, то увидим, что полезная часть — это на самом деле код внутри метода accept() .
Хотя лямбда-выражения теперь являются нормой и более простым способом сделать это, все же стоит знать, как реализовать интерфейс Consumer .
3.2. Лямбда-выражение
Основное преимущество функциональных интерфейсов Java 8 заключается в том, что мы можем использовать лямбда-выражения для их создания и избежать использования громоздких реализаций анонимных классов.
Поскольку Consumer Interface — это функциональный интерфейс, мы можем выразить его в Lambda:
Поэтому наш printConsumer упрощен:
И мы можем передать его forEach :
С момента появления лямбда-выражений в Java 8 это, вероятно, самый распространенный способ использования метода forEach .
У лямбда-выражений действительно есть реальная кривая обучения, поэтому, если вы только начинаете, в этой статье рассматриваются некоторые передовые методы работы с новой языковой функцией.
3.3. Справочник по методу
Мы можем использовать синтаксис ссылки на метод вместо обычного синтаксиса Lambda, где уже существует метод для выполнения операции над классом:
4. Работа с forEach
4.1. Итерация по коллекции
Любая итерация типа Collection — список , набор , очередь и т. д . — имеет тот же синтаксис для использования forEach.
Поэтому, как мы видели, мы можем перебирать элементы списка следующим образом:
И набор аналогичный:
Наконец, давайте посмотрим на Queue , которая также является Collection :
4.2. Итерация по карте с использованием карты forEach
Карты не являются Iterable , но они предоставляют собственный вариант forEach , который принимает BiConsumer .
Java 8 представляет BiConsumer вместо Consumer в forEach Iterable, так что действие может быть выполнено одновременно как с ключом, так и со значением Map .
Давайте создадим карту с этими записями:
Далее, давайте пройдемся по nameMap , используя forEach Map :
Как мы видим здесь, мы использовали BiConsumer для перебора записей Map :
4.3. Итерация по карте путем итерации entrySet
Мы также можем повторять EntrySet карты , используя forEach Iterable . «
Поскольку записи карты хранятся в наборе с именем EntrySet, мы можем повторить это, используя forEach :
5. Foreach против For-Loop
С простой точки зрения, оба цикла обеспечивают одинаковую функциональность: цикл по элементам в коллекции.
Основное различие между ними в том, что это разные итераторы. Усовершенствованный цикл for — это внешний итератор, а новый метод forEach — внутренний.
5.1. Внутренний итератор — forEach
Этот тип итератора управляет итерацией в фоновом режиме и оставляет программисту возможность просто закодировать то, что должно быть сделано с элементами коллекции.
Вместо этого итератор управляет итерацией и обеспечивает обработку элементов один за другим.
Давайте посмотрим на пример внутреннего итератора:
В приведенном выше методе forEach мы видим, что предоставленный аргумент является лямбда-выражением. Это означает, что метод должен знать только то, что должно быть сделано , и вся работа по итерации будет выполняться внутри.
5.2. Внешний итератор — цикл for
Внешние итераторы смешивают то, что и как должен выполнять цикл.
Перечисления , итераторы и расширенный цикл for — все это внешние итераторы (помните методы iterator() , next() или hasNext() ?). Во всех этих итераторах наша задача — указать, как выполнять итерации.
Рассмотрим этот знакомый цикл:
Хотя мы явно не вызываем методы hasNext() или next() во время итерации по списку, базовый код, обеспечивающий работу этой итерации, использует эти методы. Отсюда следует, что сложность этих операций скрыта от программиста, но она все же существует.
В отличие от внутреннего итератора, в котором коллекция сама выполняет итерацию, здесь нам требуется внешний код, который извлекает каждый элемент из коллекции.
6. Заключение
В этой статье мы показали, что цикл forEach более удобен, чем обычный цикл for-loop .
Мы также увидели, как работает метод forEach и какую реализацию можно получить в качестве аргумента, чтобы выполнить действие над каждым элементом в коллекции.
Наконец, все фрагменты, используемые в этой статье, доступны в нашем репозитории GitHub .
ForEach Loops in Java (Enhanced For Loop)
The basic “for” loop was enhanced in Java 5 and got a name “for each loop”.
It also called: Java for each loop, for in loop, advanced loop, enhanced loop.
It’s more readable and reduces a chance to get a bug in your loop.
You can use for each loop in Java to iterate through array, Collections(Set, List) or Map.
The enhanced loop works for each class that implements Iterable interface as well.
For Each Loop Syntax in Java
The for each syntax in Java has the following form:
Since Java 8 you can use one more for each statement for Collections and Maps:
this can be even simplified using method reference:
For each statement always can be represented as a basic for loop.
An array can be represented as:
And List (or any other Iterable object) can be represented as:
Let’s take a look at code examples.
Code Examples
I prepared frequently used code examples.
For Each Loop Array
On my opinion, in case of an array, the 1st example is preferable.
For Each Loop ArrayList
On the first look Java 8 example should look like this:
But you can use the power of the Stream API and write it in one line of code:
For Each Loop Map
For Each Loop Enum
Enum.values() is array, so behavior is the same as in the 1st example.
Read about enums here.
For Each Loop Chars in String
String.toCharArray() is array, the behavior is the same as in the 1st example.
For Each Loop File In Directory
For Each Loop FAQ
I collected frequently asked questions and will try to give you short answers.
Can I Remove Elements in For Each Loop
If we’re talking about not thread-safe collections like an ArrayList or HashSet than It’s not the best idea.
ConcurrentModificationException exception will be thrown in the most cases.
You should use an iterator instead:
Or super simple solution since Java 8:
How to Get Index in For Each Loop
It’s not possible. You should use basic for loop instead.
How to Get the Last Element in For Each Loop
The same as for get index case – you should use a simple for loop instead.
Foreach java – подробное руководство
Метод forEach() был введен в Java 8. Он предоставляет программистам новый, краткий способ итерации по коллекции.
Метод forEach() выполняет заданное действие для каждого элемента Iterable до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение.
Это синтаксис метода forEach().
Потребительский интерфейс – это функциональный интерфейс (интерфейс с одним абстрактным методом), который принимает один ввод и не возвращает результата.
Это определение потребительского интерфейса.
В этом примере мы перебираем список строк с помощью forEach(). Этот синтаксис можно сократить с помощью лямбда-выражения Java.
Лямбда-выражения используются в основном для определения встроенной реализации функционального интерфейса, то есть интерфейса только с одним методом. Лямбда-выражение создается с помощью лямбда-оператора.
Вот тот же пример. Лямбда-выражение делает пример более кратким.
Java forEach на карте
В следующем примере на карте используется forEach().
У нас есть карта пар строка / целое число. С помощью метода forEach() мы перебираем карту и печатаем ее пары ключ / значение.
В следующем примере мы явно показываем Consumer и Map.Entry в коде.
В примере выполняется цикл для набора записей, который извлекается с помощью entrySet().
forEach в наборе
В следующем примере для набора используется forEach().
У нас есть набор струн. С помощью метода forEach() мы перебираем набор и выводим его значения.
Использование forEach в массиве
В следующем примере forEach() используется для массива.
В этом примере у нас есть массив целых чисел. Мы используем метод Arrays.stream() для преобразования массива в поток. Затем метод forEach() перебирает элементы и выводит их на консоль.
Фильтрация списка
Мы можем легко отфильтровать наши данные перед их просмотром с помощью forEach().
В этом примере мы фильтруем список строк и выводим отфильтрованный список на консоль. Отображаются только строки из четырех символов.
IntConsumer, LongConsumer, DoubleConsumer
Начиная с Java 8, у нас есть встроенные потребительские интерфейсы для примитивных типов данных: IntConsumer, LongConsumer и DoubleConsumer.
В этом примере мы создаем три типа потребителей и перебираем их с помощью forEach().
Обычный способ зациклить карту.
В Java 8 Вы можете зациклить карту с помощью forEach + лямбда-выражения.
Нормальный цикл for в цикле список.
В Java 8 вы можете зациклить список с помощью forEach + лямбда-выражения или ссылки на метод.
Средняя оценка 4.8 / 5. Количество голосов: 9
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
For-Each loop in Java
By
Priya Pedamkar

Introduction to For-Each loop in Java
For each loop has been introduced in Java starting from JDK 5. It aims to iterate sequentially through all the elements of a Collection or array. It is also there in other languages like C#, where it uses the keyword for-each. However, Java uses the keyword ‘for’ only to implement a for-each loop, unlike C#, but its syntax differs from the conventional for a loop. This for-each loop is also known as the enhanced for loop in Java.
Syntax:
Web development, programming languages, Software testing & others
The explanation for each of the terms used above is as follows:
- ‘type’ indicates the data type of the objects of the
- ‘iter_var’ indicates the iteration variable name, which stores each value of the Collection as we iterate through the loop.
- ‘Collection’ specifies the Collection or array through which we want to iterate.
- ‘statement-block is the set of statements that we want to execute for each iteration of the loop.
It is essential to note that the for-each loop accesses the collection/array elements sequentially, where it stores the value of each element in the iteration variable. Following is the flow diagram of the for-each loop.

As you have noticed, there are certain subtle differences between for loop and for-each loop. For loop requires the number of iterations to be specified beforehand. However, this is not the case with the for-each loop, as the loop iterates from the first element to the last element of the Collection/array and does not need the number of iterations to be specified.
An important point to be kept in mind is that the type specified in the for-each loop must match the type of the elements in the collection because otherwise, there will be compatibility issues.
Examples of For-Each Loop in Java
Following are the different examples:
1. For loop
Let us find the average age of a group of people using for loop:
Code:
Output:
![]()
The output of for loop showing updation of the original array
Foreach loop with Different Conditions
The for loop with different conditions are explained below:
Code:
Output:
![]()
The output of the for-each loop showing no updation of the original array
Things to Remember About For-Each loop in java
- For-Each loop in java is used to iterate through array/collection elements in a sequence.
- For-Each loop in java uses the iteration variable to iterate over a collection or array of elements.
- Modifying the iteration variable does not modify the original array/collection as it is read-only.
- The type in the for-each loop must match the type of the original array/collection elements. need the number of iterations to be specified as it iterates over all elements of the collection.
- It is possible to stop the for-each loop using a break statement.
Recommended Articles
This is a guide to the For-Each loop in java. Here we discuss the For-Each loop in java with its code implementation in different ways, with break statement and various conditions. You may also look at the following articles to learn more –