How to convert an Iterator to a Stream? How to convert an Iterator to a Stream? java java

How to convert an Iterator to a Stream?


One way is to create a Spliterator from the Iterator and use that as a basis for your stream:

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();Stream<String> targetStream = StreamSupport.stream(          Spliterators.spliteratorUnknownSize(sourceIterator, Spliterator.ORDERED),          false);

An alternative which is maybe more readable is to use an Iterable - and creating an Iterable from an Iterator is very easy with lambdas because Iterable is a functional interface:

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();Iterable<String> iterable = () -> sourceIterator;Stream<String> targetStream = StreamSupport.stream(iterable.spliterator(), false);


Since version 21, Guava library provides Streams.stream(iterator)

It does what @assylias's answer shows.


Great suggestion! Here's my reusable take on it:

public class StreamUtils {    public static <T> Stream<T> asStream(Iterator<T> sourceIterator) {        return asStream(sourceIterator, false);    }    public static <T> Stream<T> asStream(Iterator<T> sourceIterator, boolean parallel) {        Iterable<T> iterable = () -> sourceIterator;        return StreamSupport.stream(iterable.spliterator(), parallel);    }}

And usage (make sure to statically import asStream):

List<String> aPrefixedStrings = asStream(sourceIterator)                .filter(t -> t.startsWith("A"))                .collect(toList());