Creación de flujo secuencial desde un iterador en Java

Los iteradores , en Java, se utilizan en Collection Framework para recuperar elementos uno por uno.

Una secuencia en Java es una tubería de objetos de una array o una fuente de datos de colección. Un flujo secuencial es aquel en el que los objetos se canalizan en un solo flujo en el mismo sistema de procesamiento. Otros tipos de flujo incluyen el flujo paralelo en el que los objetos se canalizan en un sistema de procesamiento múltiple.

Por lo tanto, a menudo se requiere usar el iterador como un flujo secuencial. Hay muchas formas de hacerlo, estas son:

  1. Usando Spliterator : Spliterator como otros iteradores, son para atravesar los elementos de una fuente. Una fuente puede ser una colección, un canal IO o una función de generador.

    Métodos utilizados:

    Clase Modificador y Tipo Método Descripción
    Spliteradores <T> estático Spliterator<T> spliteratorUnknownSize(Iterator<? extiende T> iterador, características int) Crea un Spliterator utilizando un iterador dado como fuente de elementos, sin estimación de tamaño inicial.
    Stream Support flujo <T> estático <T> stream(Spliterator<T> spliterator, paralelo booleano) Crea un nuevo Stream secuencial o paralelo a partir de un Spliterator.

    Explicación : Spliterator actúa como intermediario al crear secuencial Stream desde Iterator. El iterador se convierte primero en Spliterator con la ayuda de Spliterators.spliteratorUnknownSize() . Encuentre la descripción del método de esto a continuación. El Spliterator luego se convierte en Sequential Stream con la ayuda de la función StreamSupport.stream() . El segundo parámetro de esta función toma el valor booleano de si el flujo a generar es paralelo o no.

    Programa:

    // 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()));
        }
    }
    Producción:

    Sequential Stream : [G, E, E, K, S]
    
  2. Usando Iterable.Spliterator() : Spliterator es la clave para crear el flujo secuencial. Por lo tanto, en este método también se utiliza Spliterator. Pero en este método, la fuente de Spliterator se establece en un Iterable creado a partir del Iterator .

    Entonces, primero se crea el iterable a partir del iterador. Luego, el Spliterator se pasa al método stream() directamente como Iterable.spliterator() .

    Programa:

    // 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()));
        }
    }
    Producción:

    Sequential Stream : [G, E, E, K, S]
    

Publicación traducida automáticamente

Artículo escrito por RishabhPrabhu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *