Ответ
Нет, не будут. Промежуточные операции в Stream API являются ленивыми (lazy). Они лишь описывают конвейер обработки, но не выполняют его.
Почему так сделано? Это оптимизация. Вычисления происходят только когда результат действительно нужен (при вызове терминальной операции), что позволяет избежать лишней работы и поддерживать бесконечные стримы.
Демонстрация ленивости:
import java.util.List;
import java.util.stream.Stream;
public class LazyStreamExample {
public static void main(String[] args) {
List<String> data = List.of("A", "B", "C");
Stream<String> stream = data.stream()
.map(s -> {
System.out.println("map: " + s); // Этот вывод НЕ появится
return s.toLowerCase();
})
.filter(s -> {
System.out.println("filter: " + s); // И этот тоже НЕ появится
return s.startsWith("a");
});
System.out.println("Стрим создан, но ничего не выполнено.");
// Промежуточные операции map и filter не сработали.
// Только вызов терминальной операции запускает обработку:
long count = stream.count(); // Теперь map и filter выполнятся для каждого элемента
System.out.println("Count: " + count);
}
}
Порядок выполнения: При вызове терминальной операции элементы обрабатываются по одному, проходя весь конвейер (вертикальное выполнение), а не все элементы проходят каждую операцию по отдельности (горизонтальное выполнение). Это также оптимизирует работу с большими данными.