Sobes.tech
Junior — Middle
88

În ce ordine și când au loc apelurile metodelor conform contractului în lanțul Stream, în special cele declarate ca neterminale?

Companiile au fost întrebate
DCloud

Răspuns de la AI

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

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