Шаг 118.
Язык программирования Java.
Интерфейсы IntStream, LongStream, DoubleStream

На этом шаге мы рассмотрим интерфейсы IntStream, LongStream, DoubleStream

Ранее мы рассматривали интерфейс Stream, который служит для упрощения обработки потока данных. Но часто есть необходимость обрабатывать потоки целочисленных или вещественных чисел. Для этой цели были написаны интерфейсы IntStream, LongStream и DoubleStream для работы со значениями типа int, long и double соответственно. Данные интерфейсы содержат все функции что и интерфейс Stream. Но также содержат ряд функций, которые могут быть применимы только числам. В данном шаге мы рассмотрим только такие функции.

Начнем с того как можно получить необходимый поток. В интерфейсе Stream есть следующие функции:

IntStream mapToInt(ToIntFunction<? super T> mapper)
LongStream mapToLong(ToLongFunction<? super T> mapper)
DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper)

Функция mapToInt служит для преобразования элементов из обычного потока в IntStream. Правило преобразования задается в виде функции, которая передается в качестве аргумента. Данная функция преобразует элемент в значение int, mapToLong - пребразует элемент в значение long, а mapToDouble - в значение double. Аналогичные функции содержатся в интерфейсах IntStream, LongStream и DoubleStream.

Также есть еще один способ получения необходимого потока. В данных интерфейсах содержатся следующие функции:

LongStream asLongStream() // Содержится только в интерфейсе IntStream
DoubleStream asDoubleStream() // Содержится только в интерфейсе IntStream и LongStream

Функция asLongStream() преобразует заданный поток к потоку, состоящего из чисел типа long, а функция asDoubleStream() преобразует заданный поток к потоку, состоящего из чисел типа double.

В интерфейсах IntStream, LongStream и DoubleStream также содержатся следующие функции:

OptionalDouble average() // У всех интерфейсов одинаковая сигнатура

Stream<Integer> boxed() // Содержится в IntStream
Stream<Long> boxed()    // Содержится в LongStream
Stream<Double> boxed()  // Содержится в DoubleStream

int sum()    // Содержится в IntStream
long sum()   // Содержится в LongStream
double sum() // Содержится в DoubleStream

Функция average() считает среднее значение чисел из потока.

Функция boxed() создает новый поток оберток соответствующего типа. Напомним, для чисел типа int типом-оберткой является тип Integer. Для типа long типом-оберткой является тип Long. Для типа double - тип Double.

Функция sum() считает сумму элементов потока.

Для целочисленных потоков можно получить поток, состоящий из чисел заданного промежутка. Это можно сделать с помощью функций range или rangeClosed. Различие функции range от rangeClosed в том, что в функции range правая граница не включается, а в функции rangeClosed включается.

Функции min(), max(), sum(), average() хороши, но когда есть необходимость получить из потока данных сразу несколько значений, например, сумму, минимум и максимум, то лучше воспользоваться следующей функцией:

IntSummaryStatistics summaryStatistics() // Содержится в IntStream
LongSummaryStatistics summaryStatistics() // Содержится в LongStream
DoubleSummaryStatistics summaryStatistics() // Содержится в DoubleStream

Объекты типа IntSummaryStatistics, LongSummaryStatistics, DoubleSummaryStatistics содержат в себе следующую информацию:

Благодаря функции summaryStatistics() можно за один проход по элементам потока получить все выше рассмотренные значения.

На следующем шаге мы рассмотрим классы Optional, OptionalInt, OptionalLong, OptionalDouble

Предыдущий шаг Содержание Следующий шаг