Java 8 stream API

Stream API это вершина нововведений в 8: используя функциональные интерфейсы и лямбда-выражения Stream API предоставляет функциональный подход к обработке наборов данных. Говоря проще, Stream API позволяет решать классические задачи по обработке наборов данных более гибко и элегантно:

 

Вызов stream() на Iterable создаёт объект Stream, у которого есть два типа методов — конвейерные, как filter() и терминальные, как collect(). Отличаются тем, что конвейерные методы возвращают тот же самый объект Stream, а терминальные методы возвращают любой другой тип. Истинные различия конечно же глубже: конвейерные методы не выполняются сразу, а только конфигурируют конвейер обработки, в то время как терминальные методы запускают конвейер. Из этого следует, что даже если сохранить объект Stream куда-нибудь, повторное его использование после вызова терминальной функции не допускается:

Типичное использование

Поиск в коллекции элемента, удовлетворяющего условию:

Все три метода в примерах — терминальные. Их предназначение очевидно и вытекает из названия, а вот их поведение не столь очевидно. Первые два метода, anyMatch() и noneMatch(), ленивы и прервут своё выполнение, как только заданное условие выполнится, не тратя ресурсы на обход всех данных.

Получение коллекции свойств из коллекции объектов:

map() применяет лямбда-выражение к Stream и возвращает Stream такого типа, который возвращает лямбда-выражение. Поскольку это конвейерная функция, вызовов map() может быть несколько. collect() это терминальная функция, собирающая результат обработки в один объект. В данном случае используется стандартный коллектор, создающий список.

Построение коллекции из элементов другой коллекции, удовлетворяющей условию:

filter() мы уже видели раньше, эта функция применяет лямбда-выражение к элементам Stream, возвращая Stream, состоящий только из элементов, для которых выражение вернуло true.

Продолжение следует. Код примера доступен на github.