Блок 3 | Stream API Flashcards
Что такое Stream API?
Stream API — это часть Java API, которая была введена в Java 8 для облегчения работы с коллекциями данных и выполнения операций на них в функциональном стиле. Stream API предоставляет возможность создавать и манипулировать потоками данных.
Существует 3 возможных этапа потока:
1. Фильтрация;
2. Преобразование;
3. Упрощение или аккумуляция.
Что такое конвейерные и терминальные операции?
Конвейерные операции промежуточные. Они применяются к потоку данных и возвращают новый поток, который можно использовать для последующих операций. Эти операции выполняются лениво, то есть не вызывают фактического вычисления до тех пор, пока не будет вызвана терминальная операция.
Терминальные операции завершают обработку потока данных и возвращают конечный результат (или нет, если операция возвращает void). После выполнения терминальной операции поток данных больше не может быть использован.
Перечислите конвейерные (промежуточные) методы Stream API.
- filter() - фильтрует элементы потока, возвращая только элементы, удовлетворяющие условию.
- map() - преобразует каждый элемент потока.
- mapToInt() - тот же map(), но возвращает поток примитивов int (также есть соответствующие mapToDouble() и mapToLong()).
- flatMap() - трансформирует каждый объект потока в поток других объектов, то есть все элементы коллекции коллекций или потока потоков трансформирует в единый поток. (также поддерживает возврат потоков примитивов с помощью методов flatMapToInt(), flatMapToDouble(), flatMapToLong()). Может преобразовывать элементы, применяя указанную функцию к каждому элементу.
- peek() - применяет функцию Consumer к каждому элементу потока.
- sorted() - сортирует элементы потока по возрастанию. Возможна сортировка по убыванию при передаче соответствующего компаратора.
- skip() - пропускает указанное число элементов с начала потока.
- limit() - делает выборку первых элементов из родного потока в указанном количестве (отбирает элементы из потока, пока не достигнет указанного количества).
- distinct() - убирает дубликаты из потока.
- mapToObj() - трансформирует числовой поток в объектный.
Перечислите терминальные методы Stream API.
- forEach() - применяет функцию к каждому элементу потока.
- collect() - собирает все элементы потока в структуру данных.
- toArray() - собирает элементы потока в массив.
- count() - возвращает количество элементов в потоке.
- min() - возвращает минимальный элемент (условие передается в компараторе).
- max() - возвращает максимальный элемент (условие передается в компараторе).
- sum() - возвращает сумму всех элементов потока (только для числовых потоков).
- average() - возвращает среднее арифметическое всех элементов потока (только для числовых потоков).
- allMatch() - возвращает true, если все элементы удовлетворяют условию.
- noneMatch() - возвращает true, если все элементы не удовлетворяют условию.
- findFirst() - возвращает Optional с первым элементом потока (если он есть), иначе возвращает пустой Optional.
- findAny() - возвращает Optional со случайным элементом потока.
- anyMatch() - возвращает true, если хотя бы один элемент удовлетворяет условию.
Расскажите, какие шаблоны проектирования используются внутри Stream API? (Builder, Strategy, Decorator, Factory Method, Pipeline).
- Фабричный метод,
- Билдер,
- Декоратор,
- Стратегия,
- Пайплайн.
Объясните, где они используются в Stream API.
Декоратор используется для добавления новых функциональностей объекту, не изменяя его структуру.
Фабричный метод используется для создания объектов с использованием подклассов вместо создания экземпляров напрямую.
Стратегия позволяет выбирать алгоритм выполнения во время выполнения программы.
Шаблон Строитель используется для пошагового создания сложных объектов, позволяя пользователю выбирать и комбинировать компоненты.
Конвейер - это архитектурный шаблон, в котором данные обрабатываются последовательно несколькими компонентами, называемыми этапами конвейера.
В Stream API, конвейер представляет собой последовательность конвейерных операций, где каждая операция обрабатывает поток данных и передает результат следующей операции в цепочке.