Потоки примитивных типов в Java

Научитесь создавать потоки примитивных типов и работать с ними на Java с примерами.

  1. Примитивы и классы-оболочки
  2. Поддержка примитивных потоков
  3. Создание потоков примитивов
  4. Нахождение Суммы, Среднего значения, Максимального и Минимального
  5. Примитивный поток для потока объектов
  6. Вывод

Примитивы и классы-оболочки

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 для потока примитивов. Мы изучили различные способы создания примитивных потоков, а затем научились выполнять некоторые общие числовые операции с элементами потока.

Добавить комментарий

Ваш адрес email не будет опубликован.

1 × 3 =