Lecciones del módulo (2/2)
Stream API
Las Stream API en Java permiten procesar colecciones de objetos de forma declarativa, aprovechando la programación funcional. Un Stream no almacena datos, sino que transporta los elementos de una fuente (como una lista o un arreglo) a través de una tubería (pipeline) de operaciones.
Una tubería de Stream se compone de tres partes:
- Una fuente (ej.
list.stream()) - Cero o más operaciones intermedias (que devuelven un nuevo Stream, ej.
filter,map) - Una operación terminal (que produce un resultado final o un efecto secundario y cierra el Stream, ej.
collect,forEach,reduce)
Operaciones Intermedias Comunes
Las operaciones intermedias son "perezosas" (lazy): no se ejecutan hasta que se invoca una operación terminal.
filter(Predicate): filtra los elementos basándose en una condición booleana.map(Function): transforma cada elemento en otro objeto aplicando una función.sorted(): ordena los elementos del Stream.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"
Operaciones Terminales Comunes
forEach(Consumer): realiza una acción para cada elemento del Stream.collect(Collector): recoge los resultados del Stream en un contenedor (ej. una lista medianteCollectors.toList()).reduce(identity, BinaryOperator): combina los elementos del Stream en un único valor acumulativo.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Somma tutti i numeri: 10
Pruébalo tú
Completa el código utilizando el Stream de recursos para filtrar solo los números pares, recogerlos en una nueva List llamada evens e imprimirla mediante System.out.println.
Mostrar pista
Comienza llamando a `numbers.stream()`, añade `.filter(n -> n % 2 == 0)` y finalmente acumula con `.collect(Collectors.toList())`.
Solución disponible después de 3 intentos
Usa los Streams para transformar todos los nombres de la lista names a mayúsculas usando map, e imprímelos en pantalla uno a uno usando forEach con System.lineSeparator o una referencia a método.
Mostrar pista
Usa `.map(s -> s.toUpperCase())` seguido de la operación terminal `.forEach(System.out::println)`.
Solución disponible después de 3 intentos
Completa el código calculando la suma de todos los números presentes en la lista numbers utilizando un Stream y la operación terminal reduce con valor inicial 0. Imprime el resultado.
Mostrar pista
Usa `numbers.stream().reduce(0, (a, b) -> a + b)` e imprime la variable que contiene el resultado.
Solución disponible después de 3 intentos