Использовали ли вы Stream API для работы с коллекциями в Java?

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

Ответ

Да, Stream API — это стандартный и мощный способ декларативной обработки данных коллекций в Java (начиная с Java 8). Он позволяет выполнять сложные операции (фильтрацию, преобразование, агрегацию) в функциональном стиле, часто в одну цепочку вызовов.

Основные преимущества:

  • Читаемость и лаконичность: Код выражает что нужно сделать, а не как.
  • Ленивые вычисления (lazy evaluation): Промежуточные операции (filter, map) не выполняются, пока не вызвана терминальная (collect, forEach), что позволяет оптимизировать работу.
  • Параллелизм: Легко переключиться на параллельную обработку с помощью .parallelStream() для ускорения на многоядерных процессорах.

Типичный пример использования:

List<String> names = Arrays.asList("Anna", "Bob", "Alice", "Alex", "Bill");

// Фильтрация, преобразование и сбор в список
List<String> result = names.stream()          // Создание потока
        .filter(name -> name.startsWith("A")) // Промежуточная операция: фильтр
        .map(String::toUpperCase)             // Промежуточная операция: преобразование
        .sorted()                             // Промежуточная операция: сортировка
        .collect(Collectors.toList());        // Терминальная операция: сбор результата

System.out.println(result); // Вывод: [ALEX, ALICE, ANNA]

Когда использовать Stream API:

  • Для цепочек операций над коллекциями (фильтр + преобразование + агрегация).
  • Для работы с большими наборами данных, где может помочь параллельная обработка.
  • Когда нужен чистый, нефункциональный код.

Когда стоит использовать обычные циклы:

  • Для очень простых операций (например, один for-each).
  • Когда в процессе обработки требуется изменять внешние переменные или состояние.
  • При необходимости раннего выхода из цикла (break, return).