Sobes.tech
Junior — Middle
83

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

Сұралған компаниялар
айтеко

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, а не при настройке цепочки.