Ich suche nach einer prägnanten Möglichkeit, einen Iterator
in einen Stream
umzuwandeln oder genauer gesagt, den Iterator als Stream zu "anzeigen".
Aus Leistungsgründen möchte ich eine Kopie des Iterators in einer neuen Liste vermeiden:
Iterator sourceIterator = Arrays.asList("A", "B", "C").iterator();
Collection copyList = new ArrayList();
sourceIterator.forEachRemaining(copyList::add);
Stream targetStream = copyList.stream();
Basierend auf einigen Vorschlägen in den Kommentaren habe ich auch versucht, Stream.generate
zu verwenden:
public static void main(String[] args) throws Exception {
Iterator sourceIterator = Arrays.asList("A", "B", "C").iterator();
Stream targetStream = Stream.generate(sourceIterator::next);
targetStream.forEach(System.out::println);
}
Ich erhalte jedoch eine NoSuchElementException
(da keine Aufruf von hasNext
stattfindet)
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)
Ich habe mir StreamSupport
und Collections
angesehen, aber nichts gefunden.