Из docs
Операции сокращения Операция сокращения (также называемая сгибом) принимает последовательность входных элементов и объединяет их в один итоговый результат повторением применение операции объединения, например, нахождение суммы или максимума набора чисел или накопление элементов в списке. Классы потоков имеют несколько форм общих операций сокращения, называемых reduce () и collect (), а также несколько специализированных редукционных форм, таких как sum (), max () или count ().
Of Конечно, такие операции могут быть легко реализованы как простые последовательные циклы, как в:
int sum = 0; for (int x : numbers) { sum += x; }
Однако есть веские причины предпочесть операцию уменьшения над мутационным накоплением, таким как приведенное выше. Мало того, что сокращение «более абстрактно» - оно работает как с потоком в целом, а не с отдельными элементами, но правильно построенная операция сокращения по своей сути является параллелизуемой, если функции (функции), используемые для обработки элементов, являются ассоциативными и без гражданства. Например, с учетом потока чисел, для которого мы хотим найти сумму, мы можем написать:
int sum = numbers.stream().reduce(0, (x,y) -> x+y);
или:
int sum = numbers.stream().reduce(0, Integer::sum);
Эти операции восстановления могут безопасно работать в параллельно с почти никакой модификацией:
int sum = numbers.parallelStream().reduce(0, Integer::sum);
Итак, для карты вы использовали бы:
integers.values().stream().mapToInt(i -> i).reduce(0, (x,y) -> x+y);
Или:
integers.values().stream().reduce(0, Integer::sum);