Автор оригинала: mkyong.
В Java 8 мы можем использовать StreamSupport.stream
для преобразования Итератора
в Поток
.
// Iterator -> Spliterators -> Stream Streamstream = StreamSupport.stream( Spliterators.spliteratorUnknownSize( iterator, Spliterator.ORDERED) , false);
Просмотрите подпись метода StreamSupport.stream
, он принимает Разделитель
.
public staticStream stream(Spliterator spliterator, boolean parallel) { Objects.requireNonNull(spliterator); return new ReferencePipeline.Head<>(spliterator, StreamOpFlag.fromCharacteristics(spliterator), parallel); }
1. Итератор -> Поток
Интерфейс Iterator
не имеет метода spliterator()
, поэтому нам нужно использовать Spliterators.spliteratorUnknownSize
для преобразования Итератора
в Разделитель
, а затем StreamSupport.stream
для преобразования Разделителя
в Поток
.
Iterator -> Spliterators -> Stream
Этот пример преобразует Итератор
в Поток
, изменяет значения и возвращает Список
.
package com.mkyong; import java.util.*; import java.util.stream.Collectors; import java.util.stream.StreamSupport; public class JavaStreamExample1 { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add("mkyong"); list.add("java"); list.add("kotlin"); list.add("spring boot"); list.add("android"); Iterator iterator = list.iterator(); // Iterator -> Spliterators -> Stream -> List List result = StreamSupport.stream( Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false) .map(x -> x.length()) .collect(Collectors.toList()); result.forEach(x -> System.out.println(x)); System.out.println(result.getClass()); } }
Выход
6 4 6 11 7 class java.util.ArrayList
2. Итерируемый -> Поток
С тех пор как Итерируемый
интерфейс имеет метод spliterator()
и его проще преобразовать в Поток
.
package com.mkyong; import java.util.*; import java.util.stream.Collectors; import java.util.stream.StreamSupport; public class JavaStreamExample2 { public static void main(String[] args) { Iterableiterable = Arrays.asList(1, 2, 3, 4, 5); // Iterable -> Spliterators -> Stream -> List List result = StreamSupport.stream( iterable.spliterator(), false) .map(x -> x * 10) .collect(Collectors.toList()); result.forEach(x -> System.out.println(x)); System.out.println(result.getClass()); } }
Выход
10 20 30 40 50
Рекомендации
- Примеры итераторов Java
- Итератор JavaDoc
- Итерируемый JavaDoc
Оригинал: “https://mkyong.com/java8/java-8-how-to-convert-iterator-to-stream/”