Je cherche un moyen concis de convertir un Iterator
en Stream
ou plus spécifiquement de "visualiser" l'itérateur comme un flux.
Pour des raisons de performances, je voudrais éviter une copie de l'itérateur dans une nouvelle liste:
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Collection<String> copyList = new ArrayList<String>();
sourceIterator.forEachRemaining(copyList::add);
Stream<String> targetStream = copyList.stream();
Sur la base des quelques suggestions dans les commentaires, j'ai également essayé d'utiliser Stream.generate
:
public static void main(String[] args) throws Exception {
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Stream<String> targetStream = Stream.generate(sourceIterator::next);
targetStream.forEach(System.out::println);
}
Cependant, je reçois un NoSuchElementException
(car il n'y a pas d'invocation de hasNext
)
Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:364)
at Main$$Lambda$1/1175962212.get(Unknown Source)
at java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1351)
at java.util.Spliterator.forEachRemaining(Spliterator.java:326)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at Main.main(Main.java:20)
J'ai regardé StreamSupport
et Collections
je n'ai rien trouvé.
Stream.generate(iterator::next)
fonctionne?