Что такое агрегирующая функция в контексте Java Stream API?

«Что такое агрегирующая функция в контексте Java Stream API?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Агрегирующая функция (или терминальная операция) в Java Stream API — это операция, которая обрабатывает все элементы потока и возвращает одно итоговое значение или побочный эффект. Эти операции завершают ("закрывают") поток.

Основные агрегирующие функции Stream API:

  • count() — возвращает количество элементов в потоке (long).
  • sum(), average(), min(), max() — доступны для специализированных потоков (IntStream, LongStream, DoubleStream).
  • reduce() — универсальная операция для свертки элементов по заданному аккумулятору.
  • collect() — гибкая операция для преобразования потока в коллекцию или другой объект (использует Collector).

Примеры использования:

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

List<Integer> numbers = Arrays.asList(5, 3, 8, 1, 9);

// count()
long count = numbers.stream().count(); // 5

// sum(), average(), min(), max() через IntStream
int sum = numbers.stream().mapToInt(i -> i).sum(); // 26
double avg = numbers.stream().mapToInt(i -> i).average().orElse(0); // 5.2
Optional<Integer> min = numbers.stream().min(Integer::compare); // Optional[1]
Optional<Integer> max = numbers.stream().max(Integer::compare); // Optional[9]

// reduce() - сворачивание элементов
Optional<Integer> product = numbers.stream().reduce((a, b) -> a * b); // 5*3*8*1*9 = 1080
Integer sumWithIdentity = numbers.stream().reduce(0, Integer::sum); // 26 (0 - начальное значение)

// collect() - агрегация в коллекцию
List<Integer> squaredList = numbers.stream()
                                   .map(n -> n * n)
                                   .collect(Collectors.toList()); // [25, 9, 64, 1, 81]