Цикл foreach против Iterable.foreach в Java 8: что лучше?

123
19 октября 2019, 11:20

Что из следующего является лучше практикой в Java 8?

Java 8:

list.forEach(e -> e.operation);

Java 7:

for (E e : list) {
    e.operation;
}

У меня есть много циклов, которые могут быть упрощены с помощью лямбд, но есть ли какие-то реальные преимущества от использования Iterator.foreach?

Улучшится ли производительность и читабельность кода?

Answer 1

С точки зрения производительности нет никаких обещанных заметных преимуществ от использования Iterable.forEach по сравнению с foreach.

Согласно официальным javadoc на Iterable.forEach:

Performs the given action on the contents of the Iterable, in the order elements occur when iterating, until all elements have been processed or the action throws an exception.

Т.е. понятно, что не будет никакого явного параллелизма. Добавление параллелизма будет нарушением LSP.

Про читабельность кода: вы вероятно используете Iterable.foreach только с короткими однострочными лямбдами. Если "тело" лямбды увеличится, то читабельность скорее всего будет хуже, чем в цикле.

Примечание: этот ответ работает при использовании StreamAPI. Если используется только java.util.Iterable, то этот ответ перестает работать.

У вас будет сильное преимущество при параллельной обработке большого количества данных. Если вы хотите, что бы цикл выполнялся параллельно, то вы должны использовать такую конструкцию:

list.parallelStream().forEach(e -> e.operation);

Однако использование не-параллельных стримов при обработке малого количества данных будет дольше, чем foreach и циклы.

Вывод:

  1. Между Iterable.foreach и циклом foreach в производительности разницы нет.
  2. Если тело лямбды будет небольшим, то лучше использовать Iterable.foreach.
  3. Если вы хотите прирост в производительности, то вам лучше использовать parallelStream.foreach().
READ ALSO
Как проверить время отрисовки ui layout xml

Как проверить время отрисовки ui layout xml

gui приложения при открытии долго грузиться как можно померить время загрузки ? за сколько от отрисовывает layoutxml

86
не могу получить список информации о всех подписчиках бота в вайбере (API)

не могу получить список информации о всех подписчиках бота в вайбере (API)

Всем привет помогите пожалуйста найти ссылку или запрос который поможет мне вытащить список подпищиков моего вайбер ботаВ документации...

111
Как добавить свойство filter drop-shadow в ie11?

Как добавить свойство filter drop-shadow в ie11?

Есть прозрачная картинка с декоративным шрифтом при ховере на которую накладывается filter со свойством drop-shadow

223
Javascript Аналог игры Угадай слово

Javascript Аналог игры Угадай слово

Я только изучаю языкПодскажите как правильно реализовать чтоб при угадывании буквы ( при вводе с клавиатуры) в слове угадывание начиналось...

138