Вопрос проверяет понимание функционального программирования в Java и практическое применение Stream API.
Stream API - это функциональный подход к обработке коллекций данных в Java. Позволяет выполнять операции filter, map, reduce в декларативном стиле. Используется для обработки больших наборов данных, фильтрации, преобразования и агрегации. Часто применяется для замены традиционных циклов более выразительным кодом.
Java Stream API представляет мощный инструмент для обработки данных в функциональном стиле.
Основные концепции Stream API:
Создание стримов:
Из коллекций: collection.stream()
Из массивов: Arrays.stream(array)
Из значений: Stream.of(1, 2, 3)
Бесконечные стримы: Stream.iterate(), Stream.generate()
Промежуточные операции (lazy):
filter: Фильтрация элементов по условию
map: Преобразование каждого элемента
sorted: Сортировка элементов
distinct: Удаление дубликатов
limit/skip: Ограничение количества элементов
Терминальные операции (eager):
collect: Преобразование в коллекцию
forEach: Выполнение действия для каждого элемента
reduce: Агрегация элементов
count: Подсчет элементов
anyMatch/allMatch/noneMatch: Проверка условий
Практические примеры использования:
// Фильтрация и преобразование
List<String> names = employees.stream()
.filter(e -> e.getSalary() > 50000)
.map(Employee::getName)
.sorted()
.collect(Collectors.toList());
// Группировка
Map<Department, List<Employee>> byDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
// Статистика
IntSummaryStatistics stats = employees.stream()
.mapToInt(Employee::getSalary)
.summaryStatistics();
// Параллельная обработка
List<String> results = largeList.parallelStream()
.filter(item -> item.isValid())
.map(item -> item.process())
.collect(Collectors.toList());Преимущества Stream API:
Выразительность: Более читаемый и компактный код
Функциональный стиль: Отсутствие side effects
Параллелизм: Упрощение параллельной обработки
Ленивые вычисления: Оптимизация производительности
Ограничения:
Одноразовость: стрим можно использовать только один раз
Сложность отладки по сравнению с традиционными циклами
Overhead для небольших коллекций
Вывод: Stream API особенно полезен для сложных операций над коллекциями, где важны выразительность и возможность параллельной обработки.