Научитесь создавать потоки примитивных типов и работать с ними на Java с примерами.
- Примитивы и классы-оболочки
- Поддержка примитивных потоков
- Создание потоков примитивов
- Нахождение Суммы, Среднего значения, Максимального и Минимального
- Примитивный поток для потока объектов
- Вывод
Примитивы и классы-оболочки
Java не является настоящим объектно-ориентированным языком программирования и поддерживает примитивные типы, которые не являются объектами. У нас есть 7 примитивов в Java, которые являются byte, short, int, long, double, float, char.
Java позволяет обернуть их в объекты (классы-оболочки), чтобы при необходимости эти типы могли быть представлены как объекты. Соответствующими классами-оболочками являются Byte, Short, Integer, Long, Double, Float и Char.
Процесс преобразования примитива в объект называется автоматической упаковкой, а преобразование объекта в примитив называется распаковкой.
Поддержка примитивных потоков
Java Stream API, похожий на Collections API, был разработан для работы с объектами, а не с примитивными типами.
Stream API имеет встроенную поддержку представления примитивных потоков с использованием следующих специализированных классов. Все эти классы поддерживают последовательные и параллельные агрегированные операции над элементами потока.
- IntStream : представляет последовательность примитивных элементов с целочисленными значениями.
- LongStream: представляет последовательность примитивных длиннозначных элементов.
- DoubleStream: представляет последовательность примитивных двузначных элементов.
Эти классы помогают избежать множества ненужных операций создания объектов, автоматической упаковки и распаковки, если мы решим выполнить эти операции самостоятельно.
Для других примитивных типов Java не предоставляет аналогичных классов поддержки потоков, поскольку было сочтено нецелесообразным иметь так много классов. Int, long и double — очень часто используемые типы, поэтому для них была добавлена поддержка.
Создание потоков примитивов
Создание потока заданных значений
Если у нас есть несколько заданных значений int, long или double, то мы можем создать поток, используя фабричный метод of().
IntStream stream = IntStream.of(1, 2, 3, 4, 5);
LongStream stream = LongStream.of(1, 2, 3, 4, 5);
DoubleStream stream = DoubleStream.of(1.0, 2.0, 3.0, 4.0, 5.0);
Фабричный метод Stream.range()
Метод range() возвращает последовательный упорядоченный IntStream или LongStream от startInclusive (включительно) до endExclusive (эксклюзивно) с шагом увеличения 1.
IntStream stream = IntStream.range(1, 10); //1,2,3,4,5,6,7,8,9
LongStream stream = LongStream.range(10, 100);
Аналогичный метод rangeClosed() также возвращает последовательный упорядоченный поток, но конечный элемент включен в поток.
IntStream stream = IntStream.rangeClosed(1, 10); //1,2,3,4,5,6,7,8,9,10
Arrays.stream()
Мы можем напрямую вызвать метод stream() для массива, который вернет экземпляр класса Stream, соответствующий типу массива.
Например, если мы вызовем array.stream() для int[], то он вернет экземпляр IntStream.
// int[] -> Stream
int[] array = new int[]{1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(array);
// long[] -> Stream
long[] array = new long[]{1, 2, 3, 4, 5};
LongStream stream = Arrays.stream(array);
// double[] -> Stream
double[] array = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
DoubleStream stream = Arrays.stream(array);
Поток mapToInt(), mapToLong() и mapToDouble()
Другим методом получения примитивного потока является использование функции mapTo() для соответствующего типа.
Например, если у нас есть поток объектов Integer или любого другого типа с полем целочисленного типа (например, возраст человека), то мы можем получить поток всех таких значений в виде потока значений int.
List<Integer> integerList = List.of(1, 2, 3, 4, 5);
IntStream stream = integerList.stream().mapToInt(i -> i);
Stream<Employee> streamOfEmployees = getEmployeeStream();
DoubleStream stream = streamOfEmployees.mapToDouble(e -> e.getSalary());
Нахождение Суммы, Среднего значения, Максимального и Минимального
Встроенные методы
Все три класса, IntStream, LongStream и DoubleStream, состоят из числовых значений, и имеет смысл обеспечить встроенную поддержку общих агрегированных операций над элементами потока.
Эти классы предоставляют следующие методы для этих операций. Возвращаемые типы соответствуют типу потока. Следующие методы взяты из класса IntStream:
- sum() – возвращает сумму элементов в потоке.
- average() – возвращает значение OptionalDouble, описывающее среднее арифметическое элементов потока.
- max() – возвращает OptionalInt, описывающий максимальный элемент потока.
- min() – возвращает OptionalInt, описывающий элемент mimimum потока.
- count() – возвращает количество элементов в потоке.
Давайте рассмотрим несколько примеров того, как использовать эти методы.
int max = IntStream.of(10, 18, 12, 70, 5)
.max()
.getAsInt();
double avg = IntStream.of(1, 2, 3, 4, 5)
.average()
.getAsDouble();
int sum = IntStream.range(1, 10)
.sum();
Сводная статистика
Другой способ найти вышеуказанные статистические данные — использовать метод summaryStatistics(), который возвращает один из следующих классов:
IntSummaryStatistics
LongSummaryStatistics
DoubleSummaryStatistics
Теперь мы можем использовать его методы, чтобы получить требуемое значение.
- getAverage()
- getCount()
- getMax()
- getMin()
- getSum()
IntSummaryStatistics summary = IntStream.of(10, 18, 12, 70, 5)
.summaryStatistics();
int max = summary.getMax();
Примитивный поток для потока объектов
Используя метод boxed(), мы можем преобразовать примитивный поток в объектный поток соответствующего типа.
Например, чтобы получить Stream<Long> из LongStream
, мы можем вызвать метод boxed():
Stream<Integer> boxedStream1 = IntStream.of(1, 2, 3, 4, 5).boxed();
Stream<Long> boxedStream = LongStream.of(1, 2, 3, 4, 5).boxed();
Stream<Double> boxedStream2 =
DoubleStream.of(1.0, 2.0, 3.0, 4.0, 5.0).boxed();
Вывод
В этом руководстве мы разобрались с поддержкой, доступной в Java для потока примитивов. Мы изучили различные способы создания примитивных потоков, а затем научились выполнять некоторые общие числовые операции с элементами потока.