Cómo convertir un Iterator o Spliterator en un Stream
En este breve artículo os mostraré cómo utilizar la clase StreamSupport incluida a partir de Java 8 para convertir un Spliterator
o un Iterator
en un Stream
.
¿Cómo convertir un Spliterator en un Stream?
La clase StreamSupport
introduce el método stream
que crea un stream paralelo o secuencial a partir del Stream
provisto. Podemos aprovechar este método para convertir el Spliterator
en un Stream
.
1final var input = Arrays.asList(2, 3, 5, 7, 11).spliterator();
2StreamSupport.stream(input, false)
3 .filter(i -> i % 2 == 0)
4 .forEach(System.out::println);
En el fragmento anterior estoy convirtiendo una colección de enteros en un Spliterator
(línea 1). Normalmente no harías esto ya que puedes conseguir un stream directamente desde la lista. La forma habitual de obtener un Spliterator
es mediante el consumo de un método que devuelve un valor que implementa la interfaz Spliterator
.
El segundo argumento en el método StreamSupport#stream
(linea 2), especifica si el stream producido debe de procesarse en paralelo o secuencialmente. Java, por defecto, procesa los flujos secuencialmente. Depende de ti cambiar a un procesamiento en paralelo en el caso en que tu "pipeline" lo permita y quieras/puedas aprovecharlo.
Si ejecutamos el fragmento anterior, la consola mostrará lo siguiente:
2
¿Cómo convertir un Iterator en un Stream?
Ahora que os he mostrado como pasar de un Spliterator
a un Stream
, puedo mostraros cómo conseguir lo mismo con un Iterator
. El truco consiste en convertir primero el Iterator
en un Spliterator
y luego repetir el proceso anterior.
1final var iterator = Arrays.asList(2, 3, 5, 7, 11).iterator();
2final var input = Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED);
3StreamSupport.stream(input, false)
4 .filter(i -> i % 2 == 0)
5 .forEach(System.out::println);
En el fragmento anterior, estoy usando el método Spliterators#spliteratorUnknownSize (linea 2) para convertir el Iterator
. Esto me proporciona una instancia de un Spliterator
que puede procesarse del mismo modo que antes.
Referencias
- Javadoc de java.util.stream.StreamSupport
- Javadoc de java.util.Spliterators