Sobes.tech
Junior — Middle
68

Когда именно вызываются методы промежуточной обработки в цепочке Stream в Java?

Companies where asked
айтеко

Answer from AI

sobes.tech AI

Методы промежуточной обработки (intermediate operations) в Java Stream являются ленивыми — они не выполняются сразу при вызове. Вместо этого они настраивают цепочку операций, которая будет выполнена только при вызове терминальной операции (terminal operation), например, collect(), forEach(), reduce().

То есть, промежуточные методы вызываются и создают новый Stream, но фактическая обработка элементов происходит только при запуске терминальной операции. Это позволяет оптимизировать обработку, например, выполнять операции по фильтрации и преобразованию элементов только один раз, проходя по данным.

Пример:

List<String> list = Arrays.asList("a", "b", "c");

list.stream()
    .filter(s -> {
        System.out.println("filter: " + s);
        return s.startsWith("a");
    })
    .map(s -> {
        System.out.println("map: " + s);
        return s.toUpperCase();
    }); // здесь ничего не выведется, так как нет терминальной операции

list.stream()
    .filter(s -> {
        System.out.println("filter: " + s);
        return s.startsWith("a");
    })
    .map(s -> {
        System.out.println("map: " + s);
        return s.toUpperCase();
    })
    .forEach(System.out::println); // терминальная операция запускает обработку

В этом примере вывод появится только при вызове forEach, а не при настройке цепочки.