Примитивные стримы

Базовый Java
≈ 2 мин чтения

Для числовых примитивов есть отдельные stream

Обычный Stream<Integer> работает с объектами-обёртками. Для частых вычислений над примитивными числами Java предоставляет IntStream, LongStream и DoubleStream. Они позволяют работать с int, long и double без постоянного boxing и дают удобные числовые операции.

range и rangeClosed создают диапазоны

int sum = IntStream.rangeClosed(1, 5)
        .sum();

rangeClosed(1, 5) содержит числа от 1 до 5 включительно, поэтому сумма равна 15. range(1, 5) исключил бы правую границу и создал последовательность 1, 2, 3, 4.

Переход от объектов к примитивам

Из обычного stream можно перейти к примитивному с помощью mapToInt, mapToLong или mapToDouble.

double average = List.of("Java", "Spring", "SQL").stream()
        .mapToInt(String::length)
        .average()
        .orElse(0.0);

После mapToInt получаем IntStream, поэтому доступны sum(), average(), min() и max() без ручного reduce.

Возврат к объектному stream

Если дальше нужны операции с объектами, примитивный stream можно превратить обратно через boxed().

List<Integer> values = IntStream.range(1, 4)
        .boxed()
        .toList();

Результат — список [1, 2, 3]. Переходы между объектным и примитивным stream нормальны, но лучше не делать их туда-сюда без необходимости.

Выбирай примитивный stream, когда данные действительно числовые. Код обычно становится прямее: вместо Stream<Integer> и ручной свёртки можно сразу использовать специализированные числовые операции.