Middle
¿Por qué se utilizan streams en la nueva versión de Java?
sobes.tech AI
Respuesta de la IA
El uso de streams en las versiones más recientes de Java (a partir de Java 8) se debe a varias razones relacionadas con la eficiencia, la legibilidad del código y el procesamiento paralelo de datos:
- Programación funcional: Los streams permiten escribir código en un estilo más declarativo, enfocándose en qué se necesita hacer con los datos, en lugar de cómo. Esto mejora la legibilidad y el mantenimiento.
- Procesamiento paralelo: Los streams facilitan la paralelización de operaciones en colecciones mediante
parallelStream(). La JVM gestiona la división de datos y la unión de resultados, simplificando el desarrollo de aplicaciones multihilo. - Eficiencia: La evaluación perezosa (lazy evaluation) en los streams significa que las operaciones solo se ejecutan cuando es necesario, reduciendo los costos adicionales. Las operaciones intermedias (map, filter) no se ejecutan inmediatamente hasta la llamada a una operación terminal (collect, forEach).
- Mejor procesamiento de colecciones: Proporcionan un conjunto de operaciones estándar y de alto nivel para filtrar, mapear y agregar datos en colecciones, lo que reduce la cantidad de código repetitivo con bucles.
- Operaciones inmutables: Los streams no modifican la colección original de la que se crean, manteniendo los principios de inmutabilidad y facilitando la depuración.
// Ejemplo de uso de streams para filtrar y mapear
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream() // Crear stream
.filter(name -> name.startsWith("C")) // Filtrar
.map(String::toUpperCase) // Mapear
.collect(Collectors.toList()); // Recolectar en una lista
System.out.println(filteredNames); // Salida: [CHARLIE]
Streams paralelos:
// Ejemplo de procesamiento paralelo en un stream
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.parallelStream() // Crear stream paralelo
.mapToInt(Integer::intValue) // Convertir a IntStream
.sum(); // Sumar
System.out.println(sum); // Salida: 55 (puede ser calculado más rápido en sistemas multinúcleo)