Из каких основных частей состоит Stream API в Java?

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

Ответ

Поток (Stream) в Java состоит из трех логических частей, образующих конвейер обработки:

1. Источник (Source) Создает поток из данных. Источники бывают:

  • Коллекции: collection.stream()
  • Массивы: Arrays.stream(array)
  • Значения: Stream.of("a", "b", "c")
  • Файлы: Files.lines(path)
  • Генераторы: Stream.iterate(), Stream.generate()

2. Промежуточные операции (Intermediate Operations) Преобразуют элементы потока, возвращая новый поток. Ленивые — выполняются только при вызове терминальной операции.

  • filter(Predicate<T>) — фильтрация.
  • map(Function<T, R>) — преобразование.
  • sorted() — сортировка.
  • distinct() — удаление дубликатов.
  • limit(long n) — ограничение количества элементов.

3. Терминальная операция (Terminal Operation) Завершает поток, запускает выполнение всего конвейера и производит результат или побочный эффект. Энергичная.

  • collect(Collector) — агрегация в коллекцию.
  • forEach(Consumer) — выполнение действия для каждого элемента.
  • reduce() — свертка к одному значению.
  • count(), anyMatch(), findFirst() — получение результата.

Пример конвейера:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Anna");
List<String> result = names.stream()          // Источник
        .filter(name -> name.startsWith("A")) // Промежуточная операция
        .map(String::toUpperCase)             // Промежуточная операция
        .collect(Collectors.toList());        // Терминальная операция
// result = ["ALICE", "ANNA"]