Что делает метод sequential() в Java Stream API?

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

Ответ

Метод sequential() преобразует параллельный стрим в последовательный. По умолчанию стримы уже последовательные, поэтому метод нужен только для явного переключения режима после вызова parallel().

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

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

// Создаём параллельный стрим, затем явно делаем последовательным
Stream<Integer> stream = numbers.stream()
    .parallel()          // Включает параллельную обработку
    .map(n -> n * 2)     // Операция выполняется параллельно
    .sequential()        // Возвращает последовательный режим
    .filter(n -> n > 5); // Дальнейшая обработка — последовательная

System.out.println("Is parallel? " + stream.isParallel()); // false

Важные особенности

  1. Последний вызов определяет режим: stream.parallel().sequential().parallel() — результат будет параллельным.
  2. Производительность: Переключение режима добавляет небольшие накладные расходы.
  3. Типичный use-case:
    // Если нужно временно использовать параллельную обработку
    long count = data.stream()
    .parallel()              // Параллельная фильтрация
    .filter(this::heavyPredicate)
    .sequential()            // Возврат к последовательному режиму
    .map(this::complexMapping)
    .count();
  4. Альтернатива: Чаще используют отдельные стримы для разных режимов вместо переключения.

Рекомендация: Используйте parallel() только для CPU-интенсивных операций над большими наборами данных, когда профилирование подтверждает выигрыш в производительности.