639 Stimmen

Wie konvertiert man einen Iterator in einen Stream?

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.

-6voto

Verwenden Sie Collections.list(iterator).stream()...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X