Sobes.tech
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, и результат выводится.

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