从Java中的迭代器创建顺序流

2021年5月11日14:37:26 发表评论 836 次浏览

迭代器在Java中, 在集合框架中用于, 以逐一检索元素。

一种流Java中的Java是来自数组或集合数据源的对象的管道。顺序流是其中对象在同一处理系统上的单个流中进行流水线处理的流。其他类型的流包括并行流, 其中对象在多处理系统上通过管道传输。

因此, 通常需要将迭代器用作顺序流。有许多方法可以完成, 包括:

使用分离器:

分流器与其他迭代器一样, 它们用于遍历源元素。源可以是集合, IO通道或生成器功能。

使用的方法:

修饰符和类型 方法 描述
分流器 静态<T>分隔符<T> spliteratorUnknownSize(Iterator <?扩展了T>迭代器, 具有int特性) 使用给定的Iterator作为元素源(没有初始大小估算值)创建一个Spliterator。
流支持 静态<T>流<T> 流(Spliterator <T>分隔器, 布尔型并行) 从分离器创建一个新的顺序或并行流。

解释:在从Iterator创建顺序流时, Spliterator充当中介。首先借助以下功能将Iterator转换为SpliteratorSpliterators.spliteratorUnknownSize()。在下面找到此方法的描述。然后, 借助以下功能, 将分隔器转换为顺序流StreamSupport.stream()功能。的第二个参数此函数的boolean值用于判断要生成的流是否为Parallel。

程序:

//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的来源设置为

可迭代的

从创建

迭代器

.

因此, 首先从Iterator创建Iterable。然后将分隔器传递给流()直接作为Iterable.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)
     {
         //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]

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: