В Java: когда использовать Stream API, а когда цикл for?

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

Ответ

Выбор зависит от задачи, читаемости и производительности.

Используйте Stream API, когда:

  • Требуется выразительная цепочка операций над коллекцией (фильтрация, преобразование, агрегация).
  • Код должен быть декларативным и легко читаемым.
  • Параллельное выполнение может повысить производительность (.parallelStream()).
// Stream: фильтрация и сбор в список
List<String> filtered = list.stream()
    .filter(s -> s.startsWith("A"))
    .map(String::toUpperCase)
    .collect(Collectors.toList());

Используйте цикл for, когда:

  • Нужен полный контроль над итерацией (например, изменение исходной коллекции).
  • Логика сложная и включает условные переходы или побочные эффекты.
  • Критична производительность в tight loops (циклы могут быть быстрее).
// Цикл: сложная логика с побочными эффектами
List<String> filtered = new ArrayList<>();
for (String s : list) {
    if (s != null && s.startsWith("A")) {
        filtered.add(s);
        System.out.println("Added: " + s); // Побочный эффект
    }
}

Итог: Stream — для выразительности и функциональных преобразований. Цикл — для максимального контроля и производительности.