Ответ
Выбор зависит от задачи, читаемости и производительности.
Используйте 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 — для выразительности и функциональных преобразований. Цикл — для максимального контроля и производительности.