Ответ
Stream API — это набор классов и интерфейсов в Java (начиная с версии 8) для декларативной обработки последовательностей данных (коллекций, массивов, I/O источников) в функциональном стиле.
Ключевые принципы:
- Неизменяемость источника: Операции над Stream не изменяют исходную коллекцию.
- Ленивые вычисления: Промежуточные операции (например,
filter,map) выполняются только при вызове терминальной операции. - Однократное использование: Stream нельзя использовать повторно после вызова терминальной операции.
- Поддержка параллелизма: Легко переключиться на параллельную обработку с помощью
.parallelStream()или.parallel().
Типы операций:
- Промежуточные (Intermediate): Возвращают новый Stream.
filter(Predicate<T>)— фильтрация по условию.map(Function<T, R>)— преобразование каждого элемента.sorted()— сортировка.distinct()— удаление дубликатов.
- Терминальные (Terminal): Запускают обработку и возвращают результат (не Stream).
collect(Collector)— собирает элементы в коллекцию или строку.forEach(Consumer)— выполняет действие для каждого элемента.count(),min(),max(),reduce()— агрегатные функции.
Пример:
List<String> names = Arrays.asList("Anna", "Bob", "Alice", "Alex");
List<String> result = names.stream() // Создание потока
.filter(name -> name.startsWith("A")) // Промежуточная: фильтр
.map(String::toUpperCase) // Промежуточная: преобразование
.sorted() // Промежуточная: сортировка
.collect(Collectors.toList()); // Терминальная: сбор в список
// Результат: [ALEX, ALICE, ANNA]
Зачем это нужно? Stream API делает код более читаемым, выразительным и упрощает реализацию параллельных вычислений.