Stream API в Java для начинающих: filter, map, collect

Отобрать активных клиентов, отсортировать по сумме покупок и взять первые десять — в классическом стиле это цикл с условиями и временными списками. Со Stream API — одна понятная цепочка.
Редакция Бинариума
Пишем о профессиях в дизайне, BIM и IT · 7 минут чтения
Из этой статьи вы узнаете:
Что такое стрим
Стрим — конвейер обработки данных: элементы коллекции по очереди проходят через цепочку операций — фильтрацию, преобразование, сортировку — и в конце собираются в результат.
Стрим не меняет исходную коллекцию и выполняется только тогда, когда в конце цепочки есть терминальная операция.
Основные операции
| Операция | Тип | Что делает |
|---|---|---|
| filter | Промежуточная | Оставляет элементы по условию |
| map | Промежуточная | Преобразует каждый элемент |
| sorted | Промежуточная | Сортирует |
| limit | Промежуточная | Берёт первые N |
| collect | Терминальная | Собирает в список, множество, словарь |
| count, sum | Терминальная | Считает результат |
| forEach | Терминальная | Выполняет действие для каждого |
Было и стало
Цикл:
List<String> result = new ArrayList<>();
for (Client c : clients) {
if (c.isActive()) result.add(c.getName());
}
Collections.sort(result);Стрим:
List<String> result = clients.stream()
.filter(Client::isActive)
.map(Client::getName)
.sorted()
.toList();Группировка клиентов по городу:
Map<String, List<Client>> byCity = clients.stream()
.collect(Collectors.groupingBy(Client::getCity));Курс Бинариума
Java-разработчик с нуля — коллекции и современный синтаксис
Частые ошибки
- Забыли терминальную операцию — стрим ничего не делает.
- Переиспользование стрима — его можно пройти только один раз.
- Изменение внешних переменных внутри лямбд — источник трудноуловимых ошибок.
- Слишком длинные цепочки — иногда обычный цикл читается проще.
Главное
- Стрим — конвейер операций над элементами коллекции.
- Промежуточные операции настраивают обработку, терминальная запускает её.
- filter, map, sorted и collect закрывают большинство задач.
- Используйте стримы там, где они делают код понятнее.
Частые вопросы
Стримы быстрее циклов?
Не обязательно. Их главное преимущество — читаемость, а не скорость.
Что такое Client::getName?
Ссылка на метод — короткая запись лямбды c -> c.getName().
Курс Бинариума
Java-разработчик с нуля
Освойте современный Java на практических задачах.
- 11 недель обучения
- 10+ практических работ
- Проект на GitHub