Sobes.tech
Middle

¿Para qué se utilizan los streams en la nueva versión de Java?

sobes.tech AI

Respuesta de la IA

Las corrientes en Java 8+ se utilizan para el procesamiento declarativo de secuencias de datos. Permiten realizar operaciones funcionales sobre colecciones (listas, conjuntos), matrices u otras fuentes de datos en un estilo de tubería.

Las principales ventajas del uso de corrientes:

  • Estilo declarativo: Permiten describir "qué" se necesita hacer con los datos, no "cómo". Esto hace que el código sea más legible y comprensible.
  • Cálculos perezosos: Las operaciones se procesan solo cuando es necesario, lo que puede mejorar el rendimiento, especialmente al trabajar con grandes volúmenes de datos.
  • Procesamiento paralelo: Las corrientes se pueden paralelizar fácilmente (usando parallelStream()), lo que permite aprovechar eficientemente los procesadores multinúcleo.
  • Reducción del código boilerplate: Reemplazan los bucles tradicionales y los iteradores por construcciones más expresivas y compactas.
  • Inmutabilidad: Las corrientes no modifican la fuente de datos original.

Ejemplos de operaciones comunes con corrientes:

  • Filtrado: filter() - selección de elementos según una condición.
  • Transformación (map): map() - transformación de cada elemento.
  • Ordenamiento: sorted() - ordenamiento de elementos.
  • Elementos únicos: distinct() - eliminación de duplicados.
  • Agrupamiento: collect(Collectors.groupingBy(...)) - agrupamiento de elementos por una característica.
  • Estadísticas/Agrupaciones: count(), sum(), average(), max(), min(), reduce() - realización de operaciones de agregación.
  • Recoger en colección: collect(Collectors.toList()), collect(Collectors.toSet()) - recopilación de resultados en una colección.

Ejemplo de uso:

// Filtrado y transformación de una lista de cadenas usando streams
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Crear un stream desde la lista
                                   .filter(name -> name.startsWith("A")) // Filtrar: solo nombres que empiezan con "A"
                                   .map(String::toUpperCase) // Transformar: cada nombre a mayúsculas
                                   .collect(Collectors.toList()); // Recoger el resultado en una nueva lista

System.out.println(filteredNames); // Salida: [ALICE]