En Java, las colecciones de un solo elemento y los arreglos admiten la invocación directa del método stream(). Sin embargo, para colecciones como mapas, que contienen pares clave-valor, se requiere una conversión previa a una vista de un solo elemento, como mediante keySet() o entrySet(), antes de generar un flujo.
Métodos intermedios de Stream
Estos métodos producen un nuevo flujo Stream, y el flujo original debe usarse una sola vez; se recomienda el estilo de encadenamiento. Cualquier modificación en los datos del flujo no afecta a la colección o arreglo subyacente.
- filtrar: Permite seleccionar elementos basándose en una condición.
- limitar: Obtiene una cantidad específica de los primeros elementos.
- omitir: Salta una cantidad determinada de elementos iniciales.
- distintos: Elimina duplicados, dependiendo de hashCode e equals.
- concatenar: Combina dos flujos en uno solo.
- mapear: Transforma cada elemento aplicando una función.
Ejemplo de uso de mapeo:
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
List<String> datosPersonales = new ArrayList<>();
Collections.addAll(datosPersonales, "Ana-25", "Carlos-30", "Elena-22");
// Uso de expresión lambda para mapear y extraer edades
datosPersonales.stream()
.map(texto -> Integer.valueOf(texto.split("-")[1]))
.forEach(edad -> System.out.println("Edad: " + edad));
Métodos terminales de Stream
Estos métodos consumen el flujo y realizan una operación final, devolviendo un resultado o un efecto secundario.
- forEach: Itera sobre cada elemento del flujo.
- cuenta: Devuelve el número total de elementos.
- aArreglo: Recopila los elementos en un arreglo.
- colectar: Agrupa los elementos en una colección o estructura personalizada.
Ejemplo de conversión a arreglo:
String[] arregloResultante = datosPersonales.stream()
.toArray(longitud -> new String[longitud]);
Ejemplo de coleccionamiento con filtrado y mapeo a un mapa:
import java.util.stream.Collectors;
List<String> registros = new ArrayList<>();
Collections.addAll(registros, "Pedro-M-40", "Lucia-F-35", "Miguel-M-28");
Map<String, Integer> mapaEdadesMasculinas = registros.stream()
.filter(entrada -> entrada.split("-")[1].equals("M"))
.collect(Collectors.toMap(
elemento -> elemento.split("-")[0],
elemento -> Integer.valueOf(elemento.split("-")[2])
));
System.out.println("Mapa de edades: " + mapaEdadesMasculinas);