Hello, Streams!

valveВ 8 появились таки приятные и взамосвязанные между собой вещи, как interfaces, functions и streams. Java, конечно, не стала от этого функциональным языком, но некоторые вещи стало писать гораздо проще.

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

Впрочем, пора показать на практике. Пускай у нас есть список слов:

И мы хотим из этого списка отобрать все слова, длиной в 5 знаков и объединить результат в строку, разделяя слова запятой.

Раньше это привело бы к двум циклам: в одном фильтруется входящий список слов, в другом результирующий список склеивается в одну строку:

В прекрасном новом функциональном мире два не очень понятных цикла схопываются в короткое выражение, практически декларативно описывающее что делать с входящим списком:

Проверим, что результат выполнения функций идентичен:

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

PS Автор, разумеется, знаком с различными библиотечными реализациями конкатенации коллекций строк в одну строку. Однако моей целью было показать реализации без использования сторонних библиотек.