Шаг 120.
Язык программирования Java.
Интерфейс Collector и класс Collectors
На этом шаге мы рассмотрим интерфейс Collector и класс Collectors
Ранее мы рассказывали вам про функцию collect. Она принимает объект типа Collector, с помощью которого можно производить предварительные действия над элементами потока. Это может быть операция фильтрации, группировки и так далее. Collector - это интерфейс со следующими функциями:
- Supplier supplier() - supplier возвращает функцию, которая создает внутренний контейнер для работы с потом значений. Вся работа со значениями будет проходить через этот контейнер.
- BiConsumer accumulator() - accumulator возвращает функцию, которая получает очередной элемент потока и добавляет его во внутренний контейнер.
- BinaryOperator combiner() - данная функция возвращает бинарный оператор, который получает два контейнера и производит их объединение.
- Function finisher() - данная функция возвращает функцию, которая получает из внутреннего контейнера полученное значение и его возвращает.
- Set characteristics() - данная функция возвращает множества характеристик что из себя представляет данный Collector. Characteristics - это перечисление. Возможные значения следующие:
- CONCURRENT - при выставлении данного значения в качестве характеристики коллектора означает, что данный коллектор можно использовать при параллельных потоках.
- UNORDERED - при выставлении данного значения в качестве характеристики коллектора означает, что данный коллектор не несет на себя обязательств за сохранения порядка следования элементов при добавлении этих значений во внутренний контейнер.
- IDENTITY_FINISH - при выставлении данного значения в качестве характеристики коллектора означает, что функция finisher является функцией Identity (ничего не выполняющей) и значит может быть отменена.
Чтобы написать свой Collector нужно реализовать данный интерфейс, реализовав перечисленные выше функции. В библиотеке Java содержатся уже готовые коллекторы для наиболее часто выполняемых задач. Все они расположены в классе Collectors, который содержит только статические функции (далее мы будем опускать Collectors полагая что был совершен статический импорт соответствующих функций). Рассмотрим их подробнее.
Самое простое что можно сделать с потоком это преобразовать его в какую-нибудь коллекцию. Это можно сделать с помощью одного из следующих функций: