Зачем в коллекциях Java метод forEach()

Сергей Матвеенко

В java8 помимо лямбд, ввели метод forEach() для пробежки по коллекции. Разбирая его стало очевидно, что его работа построена по паттерну GoF Посетитель, что понятно уже из названия метода accept() класса Consumer. Иначе говоря, методу forEach(Consumer<? super T> action) передается Посетитель он же Consumer, выполняющий над элементами коллекции дополнительные операции, которые определяем мы. В роли Посетителя выступает Интерфейс Consumer с методом accept(T obj. Итак мы создаем анонимный внутренний класс и переопределяем в нем этот метод. Вгутряння работа метода forEach() заключается в том, чтобы передать методу accept(T obj) каждый элемент коллекции и который выполнит над ним закоденную нами операция. src для forEach() элементарный:

default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}

то есть ничего нового. мы видим добрый старый for each loop. Прикольно увидеть Посетиль, ощутить его силу когда надо что-то сделать над объектом, не меняя его и не перекомпилируя код, взять на заметку и т.п.. Но я решил замерить быстродествие обычного for each loop и метода foreach(). Как ни гонял я но получилась существенная разница в быстродействии. добрый старый цикл прописанный напрямую в коде где нужно пробежаться по элементам коллекции оказывается быстрее.
Так зачем нужен метод forEach() вызывающий тот же самый добрый старый цикл внутри себя и замедляющий работу за счет делегирования выполнения итерации другому классу?.

Сергей Матвеенко больше 1 года назадСпасибо 1
1 чел.