Иногда требуется преобразовать объект типа Iterator в Stream. Для этих целей в Java есть вспомогательный метод StreamSupport.stream:
public static <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel)
Первый аргумент это объект типа Spliterator. Мы его получим из Iterator/Iterable. Второй аргумент включает параллельную обработку Stream.
Преобразование Iterator в Stream
public static <T> Stream<T> asStream(Iterator<T> sourceIterator) { Iterable<T> iterable = () -> sourceIterator; return StreamSupport.stream(iterable.spliterator(), false); }
Проверка:
List<String> list = Arrays.asList("Alice", "Bob", "Carl"); Iterator<String> iterator = list.iterator(); asStream(iterator) .map(name -> "Hello, " + name + "!") .forEach(System.out::println);
Преобразование Iterable в Stream
public static <T> Stream<T> asStream(Iterable<T> sourceIterable) { return StreamSupport.stream(sourceIterable.spliterator(), false); }
Проверка:
List<String> list = Arrays.asList("Alice", "Bob", "Carl"); asStream(list) .map(name -> "Hello, " + name + "!") .forEach(System.out::println);
Исходный код
import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.stream.Stream; import java.util.stream.StreamSupport; public class IteratorToStreamExample { public static void main(String[] args) { List<String> list = Arrays.asList("Alice", "Bob", "Carl"); Iterator<String> iterator = list.iterator(); asStream(iterator) .map(name -> "Hello, " + name + "!") .forEach(System.out::println); asStream(list) .map(name -> "Hello, " + name + "!") .forEach(System.out::println); } public static <T> Stream<T> asStream(Iterator<T> sourceIterator) { if (sourceIterator == null) { return Stream.empty(); } Iterable<T> iterable = () -> sourceIterator; return StreamSupport.stream(iterable.spliterator(), false); } public static <T> Stream<T> asStream(Iterable<T> sourceIterable) { if (sourceIterable == null) { return Stream.empty(); } return StreamSupport.stream(sourceIterable.spliterator(), false); } }
Заключение
С помощью метода StreamSupport.stream довольно просто преобразовать Iterator или Iterable в Stream.
Конвертация Iterator в Stream