Гарантирует ли Stream API в Java доступ по индексу (RandomAccess)?

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

Ответ

Нет, Stream API абстрагируется от источника данных и не предоставляет гарантий или прямого доступа к RandomAccess.

Принцип работы: Stream API получает данные из Spliterator. В зависимости от его характеристик (включая Spliterator.ORDERED и Spliterator.SIZED), реализация может оптимизировать некоторые операции.

На практике:

  • Для ArrayList (поддерживает RandomAccess): Параллельный стрим может эффективно разбивать данные.
    List<Integer> arrayList = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
    arrayList.parallelStream() // Может использовать разбиение по индексам
             .map(i -> i * 2)
             .forEach(System.out::println);
  • Для LinkedList (не поддерживает RandomAccess): Параллельная обработка будет менее эффективной, так как разбиение требует обхода списка.

Вывод: Stream API — это абстракция для последовательной обработки. Если требуется прямой доступ по индексу, следует использовать исходную коллекцию (list.get(index)) или преобразовать Stream в коллекцию, поддерживающую RandomAccess.