Ich suche nach einer prägnanten Möglichkeit, einen Iterator
in einen Stream
oder genauer zu konvertieren, um den Iterator als Stream "anzuzeigen".
Aus Leistungsgründen möchte ich eine Kopie des Iterators in einer neuen Liste vermeiden:
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Collection<String> copyList = new ArrayList<String>();
sourceIterator.forEachRemaining(copyList::add);
Stream<String> targetStream = copyList.stream();
Aufgrund einiger Vorschläge in den Kommentaren habe ich auch versucht zu verwenden 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);
}
Ich bekomme jedoch eine NoSuchElementException
(da es keinen Aufruf von gibt 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)
Ich habe angeschaut StreamSupport
und Collections
aber nichts gefunden.
Stream.generate(iterator::next)
funktioniert?