Примитивные стримы
Для числовых примитивов есть отдельные 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<Integer> и ручной свёртки
можно сразу использовать специализированные числовые операции.