Stream API. Метод reduce()

179
20 июля 2019, 07:20

Вопрос касательно третьей формы метода:

U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)

Не могу понять за что отвечает третий параметр. Есть простой пример:

Stream<Phone> phoneStream = Stream.of(new Phone("iPhone 6 S", 54000),
                                      new Phone("Lumia 950", 45000),
                                      new Phone("Samsung Galaxy S 6", 40000),
                                      new Phone("LG G 4", 32000));
int sum = phoneStream.reduce(0,
                             (x, y) -> {
                                 if (y.getPrice() < 50000)
                                     return x + y.getPrice();
                                 else
                                     return x + 0;
                             },
                             (x, y) -> x + y);
System.out.println(sum); // 117000

Прогнал дебагером - третий параметр даже не используется. В источнике написано довольно непонятное объяснение "Третий параметр представляет бинарную операцию, которая суммирует все промежуточные вычисления.".

Answer 1

Во-первых, эта перегруженная форма полезна тогда, когда нужна двухэтапная свёртка с изменением типа результата. Попробуйте сделать так без combiner'а:

Stream.of("a", "bb", "ccc") 
      .reduce(0, (acc, s) -> acc + s.length());

Не выйдет. А так - легко

Stream.of("a", "bb", "ccc") 
      .reduce(0, (acc, s) -> acc + s.length(), (l, r) -> l + r);

Но особенно такая форма полезна, когда у вас стрим параллельный. В разных потоках будет запущено несколько экземпляров функции-аккумулятора, а потом в главном потоке их результаты будут объединены комбайнером.

READ ALSO
Как в Hibernate создать запрос с параметром?

Как в Hibernate создать запрос с параметром?

Всем приветИзучаю Hibernate, делаю запрос

196
Java фризы во время выполнения

Java фризы во время выполнения

Собрал игру нa LibGDX в Eclipse, запускаю и каждые 10± секунд происходит дроп фреймрейта до 5-10 на пару секунд и освобождается 10Мб+ оперативной памятиДумал...

144
Метод equals и ==

Метод equals и ==

Фрагмент кода

160