Come convertire un iteratore in un stream?

Sto cercando un modo conciso per convertire un Iterator in un Stream o più specificamente per “visualizzare” l’iteratore come un stream.

Per motivi di prestazioni, vorrei evitare una copia dell’iteratore in una nuova lista:

 Iterator sourceIterator = Arrays.asList("A", "B", "C").iterator(); Collection copyList = new ArrayList(); sourceIterator.forEachRemaining(copyList::add); Stream targetStream = copyList.stream(); 

Sulla base di alcuni suggerimenti nei commenti, ho anche provato a utilizzare Stream.generate :

 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); } 

Tuttavia, ottengo un NoSuchElementException (poiché non c’è invocazione di 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) 

Ho guardato StreamSupport e Collections ma non ho trovato nulla.