Stream API Flashcards
Stream.iterate
Stream.iterate(T initialValue, UnaryOperator lambda)) возвращает поток значений от начального значения до бесконечности, полученных путем применения унарного оператора.
Есть перегруженная версия Stream.iterate(T initialValue, Predicate iterationFinishCondition, UnaryOperator)
Редьюсеры стримов
Редьюсеры- это терминаторыстримов, которые для получения результата должны пройти через все элементы стримов (в отличие от например findFirst)
1) min, max -принимающие компаратор- возвращают Optional
2) reduce- Три версии
- T reduce(T seed, BiOperator accumulator)
- Optional reduce(BinaryOperator) -так как нет сида то возвращает optional
- T reduce(T seed, BinaryFunction accumulator, BinaryOperator combiner) - можно использовать в паралельных стримах
3) count
4) collect
NoSuchElementException
Кидается OPtional-ом при вызове get() у пустого а также при вызове orElseThrow() без аргумента
Дефолтные convinience методы функциональных интерфейсов
Дефолтные convinience методы функциональных интерфейсов:
Например Predicate имеет методы or and negate принимающие другой предикатный интерфейс на вход и позволяющие по сути объединять несколько условий обозначенных в двух predicate в одном общем predicate
Function и Consumer имеют метод andThen позволяющие комбинировать их. У Function также есть compose() который результат вызова начальной функции передает как аргумент в другую функцию.
Метод collect
1) Принимает коллектор
2) collect(Supplier, BiConsumer accumulator, BiConsumer combiner)
Если стрим не параллельный то комбайнер может ни разу не вызваться
Доп методы стримов примитивов (Терминальные и начальные)
1) Int/Long/DoubleSummaryStatistics summaryStatistics() -возвращает объект содержащий 5 значений статистики- min,max,average,count,sum
2)OptionalInt/Long/Double max(),min()
3) OptionalDouble average()
4) OptionalInt/Long/Double sum()
Статические методы (для лонг и инт):
1) range(start, end exclusive)
2)rangeCLosed(start, end inclusive)
Трансформации обычных стримов в примитивные и обратно
Обычный стрим в примитивный:
1)mapToInt/Long/Double(ToInt/Long/DoubleFunction) -преобразует стрим маппингом в стрим примитивов
2)flatMapToInt/Long/Double(Function)преобразует и уплощает
Примитивный стрим в обычный:
1)boxed()- в стрим соответствующих оберток
2)mapToObj(Int/Double/LongFunction)- преобразует примитивный стрим в любой объектный стрим
Примитивный стрим в примитивный стрим:
1)map(Int/Long/DoubleUnaryOperator) -преобразует примитивный стрим в стрим того же примитивного типа
2)mapToInt/Long/Double(Double/Long/IntToInt/Long/DoubleFunction) -преобразует примитивный стрим в другой примитивный стрим
Примитивные версии Optional
OptionalDouble/Long/Int
методы те же, однако вместо get() имеют getAsDouble/Long/Int()
Такие примитивные Optional возвращаются в тех методах примитивных стримов, которые у обычных стримов возвращают обычные Optional
Функциональные примитивные интерфейсы
Есть версии для Long/Int/Double (снизу на примере Int)и для Boolean только BooleanSupplier
-IntToLongFunction,IntFunction,ToIntFunction -для трансформаций стримов
-IntCOnsumer,IntSupplier,IntUnaryOperator,IntBinaryOperator,IntPredicate
У всех методов этих интерфейсов- если возвращается примитив, то к названию метода добавляет asInt - например appyAsInt у IntUnaryOperator
Группирующие коллекторы
6) groupingBy(Function, необязательлный Supplier, иной необязательный downStreamколлектор) )создает MAP> при этом результат функции становится ключом, а значения, которые дают такой результат объединяются в списки (по умолчанию) либо в что-то определенное в необязательном ином коллекторе (например можно указать Collectors.counting тогда вместо списка будет просто количество таких элементов, либо Collectors.toSet- тогда вместо списка будет сет. Супплаер позволяет явно указать какую map создавать.
7) partitioningBy(Predicate, необязательный внутренний Collector) частный случай grouping- когда все элементы стримы делятся на две группы (всегда две, даже если в одной группе нет элементов) в зависимости от того удовлетворяют они условию предиката или нет. Возвращает Map) в котором в списке находятся элементы соответствуюие и не соответствующие предикату соовтетственно. Можно добавить внутренний коллектор, который аналогично groupingBy может задать иной порядок возврата групп элементов. Опциональого супплаера для Map в отличие от groupingBy тут нет, так как тип мапы для двух ключей не важен).
8) mapping(Function, Collector- сперва функция применяется ко всем элементам стрима, затем преобразованные функцией результаты обрабатываются коллектором. Нужен для несколько уровневого коллекторства
Обычные коллекторы
1) joining(String delimiter) объединяет элементы стрима наследующие от CharSequence, разделяя их делимитером, есть перегруженная версия без делимитера.
2) averagingInt/Double/Long(ToIntFunction) возвращает среднее значений, в которые приеобразованы элементы стрима.
3) summingInt/Double/Long(ToIntFunction) возвращает сумму значений, в которые преобразованы элементы стрима.
3) maxBy/minBy(Comparator) возвращает Optional минимального и макс. значения. Существует в первую очередь для использования как downstream collector
4) summarizingInt/Double/Long(ToIntFunction) возвращает SummaryStatistic объект (хранящую мин,макс,среднее,сумму) значений, в которые преобразованы элементы стрима.
5) toMap(Function keymapper,Function valueMapper, OPTIONAL BinaryOperator , OPTIONAL Supplier mapcreator) первая функция указывает как создавать ключи из элементов стрима, вторая- как создавать значения, необязательный бинарный оператор- указывает что делать со значениями при совпадении ключей- если его нету то кидается исключение о дубле ключа, необязательный супплаер- как уточняет как создать конкретную MAP если нам нужен ее конкретный вид)
6) toList(),toSet(),toCollection(Supplier)
Названия методов функциональных интерфейсов
Supplier- get()
Predicate/BiPredicate - test()
Consumer/Biconsumer accept()
Функции и операторы- apply()