Почему Iterable<T> в Java не имеет stream() и parallelStream()
Быстрый ответ
// Преобразование Iterable в Stream
// Когда имеется Iterable, мы можем создать Stream
Stream<T> stream = StreamSupport.stream(yourIterable.spliterator(), false);
Преобразование Iterable
в Stream
в Java осуществляется с помощью метода StreamSupport.stream(). Необходимо вызвать метод spliterator() у экземпляра Iterable
и указать, должна ли обработка данных быть параллельной (true
) или последовательной (false
). Метод действует как фабрика потоков, трансформируя Iterable
в Stream
и не требуя изменений в самом интерфейсе Iterable
.
Выбор решения в пользу конструкторов
Разработчики Java приняли решение не интегрировать методы stream()
и parallelStream()
в интерфейс Iterable
, предоставив вместо этого разработчикам возможность выбирать разные типы потоков в соответствии с их конкретными задачами. Они считали, что такой подход увеличит гибкость и быстродействие системы.
Преимущества использования spliterator()
Гибкость настройки потока
Метод spliterator()
, предоставляемый интерфейсом Iterable
, дает разработчикам возможность подробно настроить поведение потока, выбирая между параллельной и последовательной обработкой данных, а также упорядоченной и неупорядоченной передачей данных.
Результат дискуссии среди экспертов
В ходе обсуждения среди экспертов в июне 2013 года было принято решение оставить Iterable
как простой интерфейс. Такой подход позволяет разработчикам создавать необходимые им потоки (Stream
) с помощью классов StreamSupport и Spliterator.
Возможности для продвинутых пользователей и разработчиков библиотек
Обращение к Stream
напрямую через Spliterator
предоставляет дополнительные возможности для опытных пользователей и разработчиков библиотек: они могут самостоятельно настраивать потоки или создавать оптимизированные источники данных для потоков.
Визуализация
Iterable<T>
можно представить как надёжный старый дизельный локомотив, а методы stream()
и parallelStream()
– это сверхсовременные гиперлупы.
🚂<Iterable<T>>== Рельсы ========================
\_ 👨🔧 (Требуется ручное преобразование)
В то время как Streams представляют собой 🔁 автомагистрали для быстрой обработки данных:
🚀 .stream() 🛣️🔁⏩
🚀 .parallelStream() 🛣️🔁⏩⏩ (Еще быстрее!)
Не получается сразу переброситься с рельс на гиперлуп? В этом и кроется задумка – Iterable<T>
был создан не для полетов, а для наземного движения, в соответствии с планом.
Практическое применение
Преобразование Iterable в Stream
Трансформация Iterable
в Stream
на практике достаточно проста. Вот пример того, как это можно сделать:
Последовательный поток:
JavaСкопировать код// Одно действие следует за другим, всё проходит спокойно и последовательно Stream<T> sequentialStream = StreamSupport.stream(yourIterable.spliterator(), false);
Параллельный поток:
JavaСкопировать код// Максимальная скорость – все двигатели работают на полную мощность Stream<T> parallelStream = StreamSupport.stream(yourIterable.spliterator(), true);
Взаимодействие с потоками: важные моменты
При создании потоков из Iterable
, следует обратить внимание на особенности исходной структуры данных. Использование parallelStream
может не дать ускорения выполнения в случае, если данные нельзя эффективно разбить.
Улучшение реализации вашего spliterator
Оптимизация метода spliterator()
в вашей собственной реализации Collection
может существенно повысить ее эффективность. Искусная настройка точной оценки размера и добавление дополнительных характеристик может ускорить обработку данных.
Поддержка потоков в AbstractCollection
Класс AbstractCollection
включает методы stream() по умолчанию, предоставляя поддержку потоков "из коробки" для всех его подклассов.
Полезные материалы
Почему в интерфейсе Iterable<T> нет методов stream() и parallelStream()? – Stack Overflow — Обсуждение специфики интерфейса
Iterable
в сравнении соStream
на StackOverflow.java.util.stream (Java Platform SE 8) — Официальная документация Oracle, описывающая работу с потоками в Java 8.
Преобразование Iterable в Stream – руководство от Baeldung — Подробное руководство по преобразованию
Iterable
вStream
.Лямбда-выражения: важное нововведение в Java – DZone — Обзор лямбда-выражений в Java и их возможностей.
Шесть причин, почему вам необходимы «умные» сервисы для облачной трансформации | CIO — Статья о важности передовых технологий в архитектуре ПО и при переходе к облачным технологиям.