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

Поточный конвейер имеет источник, ноль или более промежуточных операций и одну терминальную операцию.

Источник. Источником может быть коллекция, массив, канал ввода-вывода, функция генератора и т. д.

Промежуточная операция. Каждая промежуточная операция возвращает новый поток. Промежуточные операции выполняются лениво (например, filter() не выполняет фильтрацию, а возвращает новый поток, соответствующий заданному предикату). Следовательно, в конвейере может выполняться несколько промежуточных операций.

Операция терминала. Операции терминала (например, forEach, collect, reduce…) отмечают конец потока и возвращают результат.

Давайте посмотрим на некоторые из потоковых операций:

фильтр:

Метод filter() возвращает новый поток путем обхода всех элементов и создания нового потока, соответствующего заданному предикату. filter() является промежуточной операцией.

выход:

карта:

Метод map() возвращает новый поток после применения функции к элементам потока. map() является промежуточной операцией.

выход:

плоская карта:

Метод flatMap() возвращает новый поток, объединяя поток потоков в один поток (представьте, что List‹List‹Integer›› в List‹Integer›) для упрощения следующих операций. flatMap() — это промежуточная операция.

выход:

сортировать:

Метод sorted() возвращает поток, сортируя элементы потока в последовательном порядке. Используя Компаратор, мы можем добиться обратной сортировки потока. sorted() является промежуточной операцией.

выход:

сортировка элементов в обратном порядке:

выход:

для каждого:

forEach() выполняет действие над всеми элементами в потоке. Это терминальная операция.

собрать:

collect() выполняет изменяемую операцию сокращения над элементами потока, используя интерфейс Collector (собирает желаемые результаты в контейнер результатов, такой как Collection). Это терминальная операция.

выход:

различные:

different() возвращает новый поток отдельных элементов из потока. Это промежуточная операция.

лимит:

limit() возвращает ограниченный поток заданного размера. Это промежуточная операция.

пропустить:

skip() возвращает поток, пропуская заданные n элементов. Это промежуточная операция.

Давайте напишем программу для выполнения нескольких потоковых операций с заданным списком:

выход: