Java 8 Stream reduce

Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!


В этой статье мы рассмотрим сбор данных с помощью Stream-ов в Java.

1. Введение

Stream API  - новый способ взаимодействия с данными, представляя их в виде конечного потока данных.

С помощью Stream API в Java 8 стало возможно использование стратегии mapReduce

С ней мы сегодня и научимся работать.

2. Sum reduce

Посчитаем сумму чисел в списке

Метод reduce принимает  лямбда-выражение известное как аккумулятор (Accumulator), которое служит для сворачивания данных в одну "кучу".

А тепер посчитаем сумму начиная с 10

Перегруженный метод reduce принимает начальное значение (identity) и аккумулятор.

В первом случае результат метода reduce вернул Optional<Integer> т.к. мы не указывали начальное значение.

Во втором случае мы указали начальное значение, и метод reduce уже возвращает обычный Integer.

Попоробуем более сложное выражение

В данном случае метод reduce принимает три параметра - identity, accumulator, combiner. Где accumulator умножает каждое значение из Stream-a на начальное значение (identity) а combiner собирает результат работы accumulator.

Выходит что наш Stream преобразовывается из 1, 2, 3 в 10, 20, 30 а послее просто суммируется.

3. Search reduce

3.1 Search min value

С помощью map reduce можно так же производить поиск

Найдем наименьшее число в массиве

В данном примере мы указали начальное значение и аккумулятор который и оставляет меньшее значение.

Так же пример можно улучшить с помощью ссылки на метод min в Integer

3.2 Search longest string

Попробуем найти самую длинную строку

3.3 Complex search

Создадим класс Connection

а так же список всех связей, создав таким образом сеть

А теперь попробуем найти все связи, которые знает узел "A" с помощью mapReduce + filter

Для этого нам понадобится создать наш identity

а так же accumulator

где мы просто добавляем наши входящие узлы в список (identity) и возвращаем его.

И combiner

который соединяет два списка узлов в один.

А теперь используем все компоненты

Таким образом мы получили список узлов, которые знает узел "А"

Полный код примера

FacebookFacebook

FacebookFacebook