Является ли операция sorted() в Java Stream API stateful?

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

Ответ

Да, операция sorted() является stateful intermediate операцией. Она должна накопить все элементы потока в промежуточный буфер перед выполнением сортировки, что требует хранения состояния.

Пример:

List<Integer> numbers = Arrays.asList(3, 1, 4, 2);
List<Integer> sortedList = numbers.stream()
    .sorted() // Stateful: буферизует все элементы
    .collect(Collectors.toList());
// Результат: [1, 2, 3, 4]

Почему это важно:

  • Stateful операции (sorted(), distinct()) могут требовать больше памяти и не подходят для бесконечных потоков.
  • Stateless операции (map(), filter()) обрабатывают элементы независимо и более эффективны для параллельного выполнения.

Исключение: Если источник данных уже отсортирован (например, TreeSet), некоторые реализации могут оптимизировать sorted(), но формально операция остаётся stateful.