Junior — Middle
85
Dans quel ordre et quand les appels de méthodes selon le contrat dans la chaîne Stream ont-ils lieu, en particulier ceux déclarés comme non terminaux?
Entreprises à qui on a demandé
DCloud
Réponse de l'IA
sobes.tech IA
В Java Stream API методы делятся на промежуточные (нетерминальные) и терминальные. Промежуточные методы, такие как filter(), map(), sorted(), не выполняют обработку сразу, а лишь формируют конвейер операций — они ленивы. Терминальный метод, например, collect(), forEach(), reduce(), запускает выполнение цепочки.
Порядок вызовов по контракту:
- Промежуточные методы вызываются для построения цепочки, но не обрабатывают элементы.
- Когда вызывается терминальный метод, начинается проход по источнику данных.
- Элементы проходят через всю цепочку промежуточных операций по одному, последовательно.
- Для каждого элемента вызываются все промежуточные операции в порядке их объявления.
Например:
List<String> list = List.of("a1", "a2", "b1", "c2", "c1");
list.stream()
.filter(s -> s.startsWith("c")) // промежуточный
.map(String::toUpperCase) // промежуточный
.forEach(System.out::println); // терминальный
Здесь сначала создается цепочка, а при вызове forEach происходит проход по элементам, для каждого вызывается filter, затем map, и результат выводится.
Таким образом, промежуточные методы вызываются лениво и по элементам, терминальный — инициирует обработку.