Ответ
Stream API (пакет java.util.stream) — это абстракция для декларативной обработки последовательностей данных (коллекций, массивов, I/O) в функциональном стиле.
Ключевые характеристики:
- Не хранит данные. Поток — это конвейер операций над источником данных.
- Не изменяет источник. Операции возвращают новый поток или результат.
- Ленивые вычисления. Промежуточные операции (intermediate) выполняются только при вызове терминальной операции (terminal).
- Однократная обработка. После вызова терминальной операции поток считается потребленным.
Основные преимущества:
- Декларативность и читаемость: Код описывает что нужно сделать, а не как.
- Удобная параллельная обработка: Легко переключиться на параллельное выполнение с помощью
.parallelStream()или.parallel(). - Оптимизация: Возможность внутренних оптимизаций (short-circuiting, fusion операций).
Пример цепочки операций:
List<String> result = names.stream() // Источник
.filter(s -> s.startsWith("A")) // Промежуточная операция (фильтрация)
.map(String::toUpperCase) // Промежуточная операция (преобразование)
.sorted() // Промежуточная операция (сортировка)
.collect(Collectors.toList()); // Терминальная операция (сбор результата)
Типы операций:
- Intermediate:
filter,map,sorted,distinct,limit. - Terminal:
forEach,collect,reduce,count,anyMatch.
Ответ 18+ 🔞
Ну слушай, вот есть у тебя куча данных — список там, массив, что угодно. И ты с ними что-то сделать хочешь: отфильтровать, преобразовать, посчитать. Можно, конечно, в цикле, как дед, писать, ручками всё перебирать. Но это же, блядь, скучно и много кода! А можно взять и включить мозги на полную, использовать Stream API из java.util.stream.
Представь себе, что это такой конвейер, ёпта. Ты с одного конца закидываешь данные, а с другого получаешь уже обработанные. И самое охуенное — ты не паришься как это происходит, ты просто говоришь что тебе нужно. Это и есть декларативный стиль, красота!
Запомни три главные фишки, чтобы не выглядеть как манда с ушами:
- Он данных не хранит. Это не коллекция, куда ты что-то складываешь. Это просто инструкция, чертёж операций. Данные текут сквозь него, как вода.
- Источник не портит. Ты можешь хоть сто раз фильтровать и преобразовывать поток, а исходный список останется нетронутым. Никаких неожиданных пиздецов.
- Ленивый, как мой сосед. Промежуточные операции (их ещё intermediate зовут) сами по себе нихуя не делают. Они просто в план работ записываются. Вся магия начинается только тогда, когда ты вызываешь терминальную операцию — вот тут-то всё и запускается по-настоящему.
- Одноразовый. Поток — это как сигарета: потянул терминальную операцию — всё, кончился. Хочешь ещё разок — заведи новый.
А зачем это всё, спросишь?
- Читаемость, блядь! Вместо трёх вложенных циклов с кучей переменных ты пишешь одну понятную цепочку. Смотришь на код и сразу видишь бизнес-логику, а не технический мусор.
- Параллелизм — раз плюнуть. Захотел ускорить обработку на многоядерном процессоре? Вместо
.stream()пишешь.parallelStream(), и Java сама, хитрая жопа, размазывает задачи по потокам. Красота! - Внутренние оптимизации. Там под капотом такие штуки могут происходить, типа отсечения ненужных вычислений или слияния операций, что в ручном коде ты в жизнь не сделаешь так же эффективно.
Смотри, как это выглядит на практике:
List<String> result = names.stream() // Берём источник — список имён
.filter(s -> s.startsWith("A")) // Отфильтруем только те, что на "А" начинаются (intermediate)
.map(String::toUpperCase) // Каждое имя переведём в верхний регистр (intermediate)
.sorted() // Отсортируем по алфавиту (intermediate)
.collect(Collectors.toList()); // А вот тут — БАЦ! — собираем результат в новый список (terminal)
Видишь? Читается почти как обычное предложение: "возьми имена, отфильтруй на А, сделай большими буквами, отсортируй и собери в список". Никакого лишнего говна.
Операции делятся на два лагеря:
- Промежуточные (Intermediate):
filter,map,sorted,distinct,limit. Они только план строят. - Терминальные (Terminal):
forEach,collect,reduce,count,anyMatch. Они план выполняют и результат выдают.
Вот и вся наука. Главное — начать использовать, а там, глядишь, и впендюришь себе в проект такую красоту, что коллеги ахуеют.