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

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

Ответ

Stream API в Java (java.util.stream) — это абстракция для декларативной обработки последовательностей данных (коллекций, массивов, I/O) с возможностью цепочек операций и параллельного выполнения.

Основные концепции:

  1. Источник (Source): Коллекция, массив, генератор.

    List<String> list = Arrays.asList("a1", "a2", "b1");
    Stream<String> streamFromList = list.stream();
  2. Промежуточные операции (Intermediate): Lazy-операции, возвращающие новый Stream.

    • filter(Predicate<T>) — фильтрация.
    • map(Function<T,R>) — преобразование.
    • sorted() — сортировка.
      list.stream()
      .filter(s -> s.startsWith("a")) // Промежуточная
      .map(String::toUpperCase)       // Промежуточная
  3. Терминальные операции (Terminal): Запускают выполнение конвейера и возвращают результат (не Stream).

    • collect(Collector) — сбор в коллекцию.
    • forEach(Consumer) — выполнение действия.
    • count(), reduce() — агрегация.
      List<String> result = list.stream()
      .filter(s -> s.startsWith("a"))
      .collect(Collectors.toList()); // Терминальная операция

Преимущества:

  • Декларативный стиль: Код описывает что сделать, а не как.
  • Параллелизм: Легкое включение параллельной обработки через .parallelStream().
  • Оптимизация: Возможность обхода данных за один проход (short-circuiting, lazy evaluation).

Важно: Stream — одноразовый. После вызова терминальной операции его нельзя использовать повторно.