Чтобы не допустить, чтобы данные реализации не протекали, вместо того, чтобы возвращать, например, Collection<MyCoolObject>, можно было бы реализовать Iterable<MyCoolObject>, для чего потребовалось бы реализовать Iterator<T> из интерфейса Iterable. Таким образом, однако, структура внутренней структуры управляется, доступ к элементам осуществляется через Iterator.
С Java 8 можно добавить Stream<MyCoolObject> stream() в MyCoolObject. (См. Также: рекомендации по поддержке stream в книге Java 8 Lambdas). При добавлении метода это не сложно (и я прочитал Вопрос о Почему Iterable не предоставляет поток), кажется странным, что Java не добавила интерфейс для Streamable<T>, чтобы отразить идею Iterable<T>. (Ну, другое имя возможно, так как Streamable существует для когда-либо используемого материала CORBA).
Я думаю, что я последовал за ответом о том, почему добавление stream в Iterable было потенциально проблематичным, но я не понимаю, почему интерфейс Streaming<T> не мог быть предоставлен. Например, Collections мог бы реализовать интерфейс Streaming<T>, и он упростит для других объектов, что можно ожидать метод stream().
На основании ответа на упомянутый выше Вопрос, можно получить stream из Iterable через
Stream s = StreamSupport.stream(iter.spliterator(), false);
но это похоже на большую работу, учитывая, что MyObject мог бы просто реализовать stream(), чтобы позволить пользователю объекта
myObject.stream().filter(...).collect(...)
без промежуточного преобразования из итератора.
Есть ли причина отсутствия интерфейса для потоковой передачи объектов? Есть ли лучший подход, чем просто реализовать stream() в MyCoolObject и позволить кому-то просмотреть Javadoc, чтобы они знали, что у него есть метод stream()?
Или, вполне вероятно, я что-то не понимаю о подходе к Stream?
(Кроме того, я реализую stream() в CoolObject, но затем забудьте реализовать parallelStream(), что будет облегчено благодаря интерфейсу).