IntStream и LongStream
Избегайте упаковки значений в потоках
«IntStream и LongStream» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Зачем нужны потоки примитивов
Stream<Integer> упаковывает каждый элемент в объект Integer. IntStream, LongStream и DoubleStream работают непосредственно с примитивами, чтобы избежать затрат на упаковку.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int sum = IntStream.of(1, 2, 3, 4).sum();
System.out.println(sum);
}
}Создание IntStream
Используйте IntStream.of для явно заданных значений или применяйте Arrays.stream к массиву int[].
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] data = {10, 20, 30};
IntStream s = Arrays.stream(data);
System.out.println(s.max().getAsInt());
}
}LongStream для больших чисел
LongStream похож на IntStream, но работает со значениями типа long, предотвращая переполнение при больших суммах.
import java.util.stream.LongStream;
public class Main {
public static void main(String[] args) {
long total = LongStream.of(1_000_000_000L, 2_000_000_000L).sum();
System.out.println(total);
}
}Специализированные терминальные операции
Потоки примитивов добавляют числовые методы, которых нет у потоков объектов: sum, min, max, average.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream nums = IntStream.of(4, 8, 15, 16, 23, 42);
System.out.println(nums.average().getAsDouble());
}
}Результаты OptionalInt
min и max возвращают OptionalInt, потому что поток может быть пустым. Используйте getAsInt или orElse.
import java.util.OptionalInt;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
OptionalInt result = IntStream.empty().max();
System.out.println(result.orElse(-1));
}
}map сохраняет примитивный тип
map у IntStream принимает IntUnaryOperator и возвращает другой IntStream, поэтому упаковки не происходит.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int sumOfSquares = IntStream.of(1, 2, 3)
.map(n -> n * n)
.sum();
System.out.println(sumOfSquares);
}
}filter в потоках примитивов
filter принимает IntPredicate и оставляет подходящие примитивные значения.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
long evens = IntStream.of(1, 2, 3, 4, 5, 6)
.filter(n -> n % 2 == 0)
.count();
System.out.println(evens);
}
}reduce в IntStream
reduce сворачивает поток с помощью IntBinaryOperator. Если указать начальное значение, он напрямую возвращает int.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int product = IntStream.rangeClosed(1, 5)
.reduce(1, (a, b) -> a * b);
System.out.println(product);
}
}forEach для примитивов
forEach принимает IntConsumer, также избегая упаковки.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream.of(7, 8, 9).forEach(n -> System.out.println(n));
}
}Сбор в массив
toArray возвращает примитивный массив int[] — естественный результат для IntStream.
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] doubled = IntStream.of(1, 2, 3).map(n -> n * 2).toArray();
System.out.println(Arrays.toString(doubled));
}
}Преобразование между Int и Long
IntStream.asLongStream расширяет примитивы до long без упаковки.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
long sum = IntStream.of(1, 2, 3).asLongStream().sum();
System.out.println(sum);
}
}Быстрая проверка
Какова главная причина использовать IntStream вместо Stream<Integer>?
Повторение
Вы использовали потоки примитивов, чтобы избежать упаковки:
IntStreamиLongStreamхранят примитивные значения.- Они добавляют числовые терминальные операции:
sum,min,max,average. minиmaxвозвращаютOptionalInt.map,filter,reduceиtoArrayсохраняют примитивный тип.
Часто задаваемые вопросы
Урок «IntStream и LongStream» бесплатный?
Да — полный текст урока «IntStream и LongStream» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «IntStream и LongStream»?
Избегайте упаковки значений в потоках Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «IntStream и LongStream»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- IntStream и LongStream
- Диапазоны и агрегирующие операции
- Преобразование объектных потоков и обратно
- Генерация примитивных потоков