Что такое Stream API в Java?

«Что такое Stream API в Java?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Stream API — это набор классов и интерфейсов в Java (начиная с версии 8) для декларативной обработки последовательностей данных (коллекций, массивов, I/O источников) в функциональном стиле.

Ключевые принципы:

  • Неизменяемость источника: Операции над Stream не изменяют исходную коллекцию.
  • Ленивые вычисления: Промежуточные операции (например, filter, map) выполняются только при вызове терминальной операции.
  • Однократное использование: Stream нельзя использовать повторно после вызова терминальной операции.
  • Поддержка параллелизма: Легко переключиться на параллельную обработку с помощью .parallelStream() или .parallel().

Типы операций:

  1. Промежуточные (Intermediate): Возвращают новый Stream.
    • filter(Predicate<T>) — фильтрация по условию.
    • map(Function<T, R>) — преобразование каждого элемента.
    • sorted() — сортировка.
    • distinct() — удаление дубликатов.
  2. Терминальные (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 делает код более читаемым, выразительным и упрощает реализацию параллельных вычислений.