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 элементов. Это промежуточная операция.
Давайте напишем программу для выполнения нескольких потоковых операций с заданным списком:
выход: