Junior — Middle
60
В каком порядке и когда происходят вызовы методов по контракту в цепочке Stream, особенно те, что объявлены как нетерминальные?
Компании, где спрашивали
DCloud
Ответ от нейросети
sobes.tech AI
В 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, и результат выводится.
Таким образом, промежуточные методы вызываются лениво и по элементам, терминальный — инициирует обработку.