Вопрос касательно третьей формы метода:
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
Прогнал дебагером - третий параметр даже не используется. В источнике написано довольно непонятное объяснение "Третий параметр представляет бинарную операцию, которая суммирует все промежуточные вычисления.".
Во-первых, эта перегруженная форма полезна тогда, когда нужна двухэтапная свёртка с изменением типа результата. Попробуйте сделать так без 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);
Но особенно такая форма полезна, когда у вас стрим параллельный. В разных потоках будет запущено несколько экземпляров функции-аккумулятора, а потом в главном потоке их результаты будут объединены комбайнером.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Собрал игру нa LibGDX в Eclipse, запускаю и каждые 10± секунд происходит дроп фреймрейта до 5-10 на пару секунд и освобождается 10Мб+ оперативной памятиДумал...