Java 从一个迭代器中创建顺序流
迭代器 ,在Java中,在集合框架中被用来一个一个地检索元素。
Java中的 流 是一个来自数组或集合数据源的对象的管道。顺序流是一个对象在同一处理系统上以单一流的方式进行流水作业。其他类型的流包括并行流,其中对象在多处理系统上进行流水作业。
因此,经常需要使用迭代器作为一个顺序流。有许多方法可以做到这一点,这些方法是。
- 使用 Spliterator : Spliterator和其他迭代器一样,是用来遍历一个源的元素的。一个源可以是一个集合,一个IO通道或一个生成器函数。
使用的方法:
Class | Modifier and Type | Method | Description |
---|---|---|---|
Spliterators | static |
spliteratorUnknownSize(Iterator<? extends T> iterator, int characteristics) | 使用给定的Iterator作为元素来源创建一个Spliterator,没有初始大小估计。 |
StreamSupport | static |
stream(Spliterator |
从Spliterator创建一个新的顺序或并行流。 |
解释:Spliterator在从Iterator创建顺序流时充当中间人。在Spliterators.spliteratorUnknownSize()的帮助下,Iterator首先被转换为Spliterator。请看下面的方法描述。然后在StreamSupport.stream()函数的帮助下,Spliterator被转换为顺序流。这个函数的第二个参数是一个布尔值,表示要生成的流是否是并行的。
程序:
// Java program to create a Sequential Stream
// from an Iterator
import java.util.*;
import java.util.stream.*;
class GfG {
// Function to create a sequential Stream
// from an Iterator
public static <T> Stream<T>
iteratorToSequentialStream(Iterator<T> itr)
{
// convert the iterator into a Spliterator
Spliterator<T> spitr = Spliterators.spliteratorUnknownSize(
itr, Spliterator.NONNULL);
// Convert spliterator into a sequential stream
// The second parameter "false" passess whether
// the stream is to be created parallel or not
return StreamSupport.stream(spitr, false);
}
public static void main(String[] args)
{
Iterator<String> iterator = Arrays.asList("G", "E", "E",
"K", "S").iterator();
Stream<String> stream = iteratorToSequentialStream(iterator);
System.out.println("Sequential Stream : " +
stream.collect(Collectors.toList()));
}
}
输出:
Sequential Stream : [G, E, E, K, S]
- 使用Iterable.Spliterator() 。Spliterator是创建顺序流的关键。因此,在这个方法中,也使用了Spliterator。但是在这个方法中,Spliterator的来源被设置为一个从Iterator创建的**Iterable。
所以首先Iterable是由Iterator创建的。然后Spliterator被直接传递给stream()方法,作为Iterable.splitator()。
程序:
// Java program to create a Sequential Stream
// from an Iterator
import java.util.*;
import java.util.stream.*;
class GfG {
// Function to create a sequential Stream
// from an Iterator
public static <T> Stream<T>
iteratorToSequentialStream(Iterator<T> itr)
{
// Get an iterable from itr
Iterable<T> itb = () -> itr;
// Get spliterator() from iterable and then
// Convert into a sequential stream.
// The second parameter "false" passess whether the
// stream is to be created parallel or not
return StreamSupport.stream(itb.spliterator(), false);
}
public static void main(String[] args)
{
Iterator<String> iterator = Arrays.asList("G", "E", "E",
"K", "S").iterator();
Stream<String> stream = iteratorToSequentialStream(iterator);
System.out.println("Sequential Stream : " +
stream.collect(Collectors.toList()));
}
}
输出:
Sequential Stream : [G, E, E, K, S]