Java 从一个迭代器中创建顺序流

Java 从一个迭代器中创建顺序流

迭代器 ,在Java中,在集合框架中被用来一个一个地检索元素。

Java中的 是一个来自数组或集合数据源的对象的管道。顺序流是一个对象在同一处理系统上以单一流的方式进行流水作业。其他类型的流包括并行流,其中对象在多处理系统上进行流水作业。

因此,经常需要使用迭代器作为一个顺序流。有许多方法可以做到这一点,这些方法是。

  1. 使用 Spliterator : Spliterator和其他迭代器一样,是用来遍历一个源的元素的。一个源可以是一个集合,一个IO通道或一个生成器函数。

使用的方法:

Class Modifier and Type Method Description
Spliterators static Spliterator spliteratorUnknownSize(Iterator<? extends T> iterator, int characteristics) 使用给定的Iterator作为元素来源创建一个Spliterator,没有初始大小估计。
StreamSupport static Stream stream(Spliterator spliterator, boolean parallel) 从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]
  1. 使用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]

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程