Чтобы не допустить, чтобы данные реализации не протекали, вместо того, чтобы возвращать, например, 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()
, что будет облегчено благодаря интерфейсу).