Table of Contents

Streams

¿Qué son los Streams?

Los streams son clases que encapsulan colecciones o arrays y permiten que éstos soporten operaciones utilizando lambdas. De esa forma se simplifica operar sobre los elementos de toda la colección o sobre la propia colección en si.

Cómo crear Streams

Los streams se pueden generar llamando al método stream() de cualquiera de las implementaciones de la interfaz java.util.Collection.

List<Animal> listaAnimales = new ArrrayList<>();
listaAnimales.add(. . .);
listaAnimales.add(. . .);
listaAnimales.add(. . .);
Stream<Animal> streamAnimales = listaAnimales.stream();

También se pueden crear a partir de objetos de forma individual, sin partir de ninguna colección ya existente:

Stream<String> streamNombres = Stream.of("Juan", "Francisco", "Ana", "María");

Y también se puede crear un stream a partir de un array:

String[] nombres = {"Juan", "Francisco", "Ana", "María"};
Stream<String> streamNombres = Stream.of(nombres);

Operaciones intermedias

Son aquellas operaciones que siempre acaban devolviendo el stream modificado.

Operaciones finales

En este caso, son las operaciones que devuelven como resultado algo diferente que el propio stream.

stream ordenado

como parámetro

como parámetro

Veamos algunos ejemplos para la siguiente colección:

List<String> numeros = new ArrayList<>();
numeros.add("uno");
numeros.add("dos");
numeros.add("cinco");
numeros.add("tres");
numeros.add("cuatro");
numeros.add("cinco");
numeros.stream()
    .filter(nombre -> nombre.startsWith("c"))
    .forEach(System.out::println);
cinco
cuatro
cinco
numeros.stream()
    .distinct()
    .filter(nombre -> nombre.startsWith("c"))
    .forEach(System.out::println);
cuatro
cinco
numeros.stream()
    .filter(nombre -> nombre.startsWith("c"))
    .peek(nombre -> System.out.println(nombre.length()))
    .forEach(System.out::println);
5
cinco
6
cuatro
5
cinco
numeros.stream()
    .peek(nombre -> System.out.println(nombre.length()))
    .filter(nombre -> nombre.startsWith("c"))
    .forEachOrdered(System.out::println);
3
3
5
cinco
4
6
cuatro
5
cinco
Optional<String> primerNumero = numeros.stream().findAny();
System.out.println(primerNumero.get());
uno
Optional<String> primerNumero = numeros.stream().findFirst();
System.out.println(primerNumero.get());
uno
// Orden no garantizado
numeros.stream().parallel().forEach(System.out::println);
tres
cinco
cuatro
dos
cinco
uno
// Orden garantizado
numeros.stream().parallel().forEachOrdered(System.out::println);
uno
dos
cinco
tres
cuatro
cinco
Optional<String> primerNumero = numeros.stream().parallel().findAny();
tres
List<String> numeros = numeros.stream()
                            .sorted(Comparator.comparing(nombre::length)
                            .collect(Collectors.toList());

© 2021-2023 Santiago Faci