Рубрики
Без рубрики

Функциональная обработка коллекций в Java с использованием потоков

Потоки Java были введены в Java 8. Они предоставляют декларативный (или, точнее, функциональный) API… Помеченный как java, функциональный, первый пост.

Потоки Java были введены в Java 8. Они предоставляют декларативный (или, точнее, функциональный) API для работы с коллекциями . java.util.stream имеет следующее/| описание в java docs .

Классы для поддержки операций в функциональном стиле над потоками элементов, таких как преобразования mapreduce в коллекциях.

Есть еще кое-что о потоках, помимо функционального способа обработки коллекций. Речь также идет о ленивой оценке, параллелизме и потоках, не использующих коллекции (например, бесконечные потоки, IntStream , …). Но охват всех этих понятий выходит за рамки этой статьи и поэтому здесь не описывается (может быть, в дополнительной статье?).

В следующем ответе показано сравнение между функциональным и декларативным способом суммирования некоторых чисел. На мой взгляд, декларативный способ использования потоков не только более лаконичен, но и более удобочитаем. Поэтому я предпочитаю функциональный стиль.

Интерфейс Collection ( см. документацию ) содержит метод default Stream stream() {...}; , который возвращает экземпляр Stream . Обычно используемые интерфейсы, такие как Список , Стек и Очередь реализует интерфейс Collection , и, таким образом, вы можете создать Stream , вызвав метод stream() для экземпляров классов, реализующих эти интерфейсы (например, HashSet/| ).

Бонус: бесконечные потоки

Существуют также так называемые бесконечные потоки , которые вычисляются лениво (что означает, что они не создаются заранее; они должны, потому что в противном случае им потребовался бы бесконечный объем памяти). Убедитесь в том, чтобы ограничить поток, чтобы предотвратить потенциальный бесконечный запуск программы.

Есть два различных вида операций, которые вы можете выполнять в потоке: промежуточные и терминальные операции . Объединение этих операций в цепочку создает потоковый конвейер |/. Некоторые операции показаны на примерах ниже. Вы можете прочитать подробности о промежуточных и терминальных операциях в документации .

Промежуточные операции

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

Поток фильтр(предикат супер T> предикат) (документы)

Возвращает поток, состоящий из элементов этого потока, которые соответствуют заданному предикату.

Пример: Получение только книг с более чем 400 страницами.

Поток отсортирован(компаратор супер T> компаратор) (документы)

Возвращает поток, состоящий из элементов этого потока, отсортированных в соответствии с предоставленным компаратором.

Что? Отсортируйте все книги по названию.

Подсказка: существует также Поток отсортирован() способ, который может быть использован, если T реализует Сравнимый интерфейсы сравните С(T o) метод.

Поток карта(функция super T,? расширяет R> mapper) (документы)

Возвращает поток, состоящий из результатов применения данной функции к элементам этого потока.

Что? Получение только названия всех книг.

Комбинирование фильтра, сортировки и отображения

Что? Получайте только книги с более чем 400 страницами, сортируйте их по названию и сопоставляйте только с их названием.

Прочитав Что? описания, вы понимаете, что все это связано с декларативным программированием.

Терминальные операции

Терминальные операции завершают конвейер потока. Они либо дают побочный эффект (например, печать), либо результат (например, уменьшение). После терминальной операции поток потребляется .

void forEach(Потребитель супер T> действие) (документы) супер T> действие) (документы)

Выполняет действие для каждого элемента этого потока.

для каждого создает побочный эффект (он возвращает void, поэтому он должен вызывать побочный эффект, иначе он просто ничего не сделает). forEach используется во всех предыдущих примерах для вывода результата.

T уменьшить(идентификатор T, двоичный оператор накопитель) (документы)

Выполняет сокращение элементов этого потока, используя предоставленное идентификационное значение и ассоциативную функцию накопления, и возвращает уменьшенное значение.

Что? Получите сумму всех страниц всех книг.

Подсказка: Существуют и другие перегрузки системы уменьшить метод.

R собирать(Коллекционер (T,A, R> коллектор) (документы)

Выполняет изменяемую операцию уменьшения для элементов этого потока с помощью коллектора.

Что? Получить Набор содержащий названия всех книг.

Вы можете сделать гораздо больше с помощью Collectors . Вы также можете сгруппировать результат (представьте, что вы группируете книги по автору или жанру).

Подсказка: Существуют и другие перегрузки системы собирать метод.

Это мой самый первый пост в блоге. Я был бы очень признателен за ваши отзывы. Что вам (не) понравилось? И почему? Пожалуйста, дайте мне знать, чтобы я мог улучшить содержание.

Я также стараюсь создавать ценный контент в Твиттере. Просто взгляните .

Оригинал: “https://dev.to/jannikwempe/functional-handling-of-collections-in-java-using-streams-4ed”