A logo showing the text blog.marcnuri.com
English
Inicio»Java»Cómo convertir un Iterator o Spliterator en un Stream

Entradas Recientes

  • Fabric8 Kubernetes Client 6.4.0 está disponible!
  • Fabric8 Kubernetes Client 6.3.1 está disponible!
  • Eclipse JKube 1.10 está disponible!
  • Fabric8 Kubernetes Client 6.2.0 está disponible!
  • Fabric8 Kubernetes Client 6.1 está disponible!

Categorías

  • Antiguo
  • Front-end
  • Herramientas
  • Java
  • JavaScript
  • Operaciones
  • Proyectos personales

Archivos

  • enero 2023
  • diciembre 2022
  • noviembre 2022
  • octubre 2022
  • agosto 2022
  • julio 2022
  • mayo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • diciembre 2020
  • octubre 2020
  • agosto 2020
  • mayo 2020
  • marzo 2020
  • noviembre 2019
  • octubre 2019
  • julio 2019
  • diciembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • marzo 2018
  • febrero 2018
  • noviembre 2017
  • octubre 2017
  • agosto 2017
  • julio 2017
  • julio 2016
  • enero 2016
  • diciembre 2015
  • noviembre 2015
  • marzo 2007

Cómo convertir un Iterator o Spliterator en un Stream

2021-10-09 en Java etiquetado Java / Java 8 / Streams por Marc Nuri | Última actualización: 2021-10-09
English version

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
Twitter iconFacebook iconLinkedIn iconPinterest iconEmail icon

Navegador de artículos

← Cómo generar un serialVersionUID en IntelliJ IDEAcURL: ejemplos de DELETE requests →
© 2007 - 2023 Marc Nuri