У меня есть интерфейс, который возвращается java.lang.Iterable<T>
.
Я хотел бы манипулировать этим результатом с помощью Java 8 Stream API.
Однако Iterable не может «течь».
Любая идея, как использовать Iterable в качестве потока без преобразования его в список?
java
java-8
java-stream
iterable
Rayman
источник
источник
myIterable.stream()
не существует!Stream.of(iterable)
производитStream<Iterable<Object>>
.Ответы:
Есть гораздо лучший ответ, чем
spliteratorUnknownSize
непосредственное использование , что проще и дает лучший результат.Iterable
естьspliterator()
метод, так что вы должны просто использовать его, чтобы получить свой сплитератор. В худшем случае это тот же код (используется реализацией по умолчаниюspliteratorUnknownSize
), но в более распространенном случае, когда вашаIterable
коллекция уже является коллекцией, вы получите лучший сплитератор и, следовательно, лучшую производительность потока (возможно, даже хороший параллелизм). Это также меньше кода:Как видите, получение потока от
Iterable
(см. Также этот вопрос ) не очень болезненно.источник
Stream
был бы хорош, напримерStream.ofIterable(iterable)
.Если вы можете использовать библиотеку Guava, начиная с версии 21, вы можете использовать
источник
Lists.newArrayList(Iterable)
.Вы можете легко создать
Stream
изIterable
илиIterator
:источник
stream(...)
загромождать ваш код?Я хотел бы предложить использовать библиотеку JOOL , она скрывает магию сплитератора за вызовом Seq.seq (iterable), а также предоставляет целый ряд дополнительных полезных функций.
источник
Итак, в качестве другого упомянутого ответа Guava поддерживает это, используя:
Я хочу подчеркнуть, что реализация делает что-то немного отличное от других предложенных ответов. Если
Iterable
это тип,Collection
они разыгрывают его.источник
Я создал этот класс:
Я думаю, что он отлично читается, потому что вам не нужно думать о разделителях и логических значениях (isParallel).
источник
Очень простой способ обойти эту проблему - создать
Streamable<T>
расширение интерфейсаIterable<T>
, содержащееdefault <T> stream()
метод.Теперь любой из ваших
Iterable<T>
s может быть тривиально сделан, просто объявив ихimplements Streamable<T>
вместоIterable<T>
.источник
Если вы используете Vavr (ранее известный как Javaslang), это может быть так просто:
источник
Еще один способ сделать это с Java 8 и без внешних библиотек:
источник