21. Streams y la API Stream en Java

La Stream API en Java es un enfoque moderno y funcional para procesar secuencias de elementos. Introducida en Java 8, Stream API representa un cambio importante en la forma en que los desarrolladores pueden escribir código conciso y legible para manipular colecciones de datos. En este capítulo, exploraremos el poder de Streams, desde conceptos básicos hasta técnicas avanzadas.

Introducción a las transmisiones

Los flujos son abstracciones que le permiten procesar elementos de una colección de forma declarativa. En lugar de iterar explícitamente sobre una colección usando bucles, puede usar Stream API para describir lo que desea hacer con estos elementos. La API Stream admite operaciones de agregación como filtrar, mapear, reducir y muchas otras.

Crear secuencias

Puedes crear una transmisión de varias maneras. Una de las formas más comunes es desde colecciones, llamando al método stream():

Lista<String> lista = Arrays.asList("a", "b", "c");
Transmitir<String> corriente = lista.corriente();
Otra forma es utilizar métodos estáticos de la clase Stream para crear secuencias de matrices o valores específicos:
Secuencia<Entero> numberStream = Stream.of(1, 2, 3, 4, 5);
IntStream intStream = Arrays.stream(nuevo int[] {1, 2, 3, 4, 5});

Operaciones Intermedias

Las operaciones intermedias son aquellas que transforman un Stream en otro Stream, como filter, map y sorted. Son diferidos, lo que significa que no se ejecutan hasta que se invoca una operación de terminal.

  • filtro: selecciona elementos que cumplen con un criterio específico.
    stream.filter(s -> s.startsWith("a"));
    
  • mapa: Aplica una función a cada elemento y devuelve un Stream con los resultados.
    flujo.map(String::toUpperCase);
    
  • ordenado: Ordena los elementos según el orden natural o un comparador proporcionado.
    flujo.ordenado(Comparator.naturalOrder());
    

Operaciones de terminales

Las operaciones de terminal son aquellas que producen un resultado o efecto secundario, como forEach, collect, reduce y count. Cuando se invoca una operación de terminal, comienza el procesamiento de Stream.

  • forEach: Ejecuta una acción para cada elemento del Stream.
    flujo.forEach(System.out::println);
    
  • recopilar: recopila los elementos de Stream en una colección u otro tipo de resultado.
    Lista<String> recopilado = stream.collect(Collectors.toList());
    
  • reducir: combina elementos de Stream para producir un valor único.
    Opcional<String> concatenado = stream.reduce(String::concat);
    
  • count: Devuelve el número de elementos del Stream.
    cuenta larga = flujo.cuenta();
    

Transmisiones paralelas

Los flujos paralelos permiten que las operaciones se ejecuten en paralelo en diferentes subprocesos, lo que puede conducir a un mejor rendimiento en sistemas multiprocesador. Para crear una secuencia paralela, puede llamar al método parallelStream() en una colección o al método parallel() en una secuencia existente.

Transmitir<String> ParallelStream = lista.parallelStream();

Consideraciones de rendimiento

Al utilizar Streams, es importante tener en cuenta las implicaciones en el rendimiento. Operaciones como sorted y distinct pueden resultar costosas ya que requieren procesamiento adicional. Además, el uso de Parallel Streams no siempre garantiza un aumento del rendimiento e incluso puede resultar contraproducente si el coste de dividir y fusionar tareas es mayor que la ganancia del procesamiento paralelo.

Buenas Prácticas

Al trabajar con Streams, es fundamental seguir algunas buenas prácticas para mantener el código limpio y eficiente:

  • Utilice métodos de referencia siempre que sea posible para mejorar la legibilidad.
  • Evite cambiar el estado de los objetos externos dentro de las operaciones de Stream.
  • Prefiera operaciones sin estado como map y filter a operaciones con estado como sorted.
  • Considere la legibilidad y el mantenimiento del código en lugar de las microoptimizaciones.

Conclusión

Stream API en Java ofrece una forma potente y flexible de trabajar con colecciones de datos. Con una amplia gama de operaciones intermedias y terminales, Streams permite a los desarrolladores escribir código más expresivo y conciso. Al comprender y aplicar correctamente los conceptos de Streams, puede mejorar significativamente la calidad y el rendimiento de su código Java.

Ahora responde el ejercicio sobre el contenido:

¿Cuál de las siguientes afirmaciones sobre Stream API en Java es cierta?

¡Tienes razón! Felicitaciones, ahora pasa a la página siguiente.

¡Tú error! Inténtalo de nuevo.

Imagen del artículo Concurrencia y subprocesos en Java

Siguiente página del libro electrónico gratuito:

117Concurrencia y subprocesos en Java

6 minutos

¡Obtén tu certificado para este curso gratis! descargando la aplicación Cursa y leyendo el libro electrónico allí. ¡Disponible en Google Play o App Store!

Disponible en Google Play Disponible en App Store

+ 6,5 millones
estudiantes

Certificado gratuito y
válido con código QR

48 mil ejercicios
gratis

Calificación de 4.8/5
en tiendas de aplicaciones

Cursos gratuitos de
vídeo, audio y texto.