Programación

1º DAM/DAW - Curso 2023-2024

User Tools

Site Tools


apuntes:streams

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.

  • distinct(): Devuelve un stream con los elementos distintos
  • filter(Predicate<? super T> predicado): Devuelve un stream con los elementos que cumplen el filtro pasado como parámetro
  • limit(long tamanoMaximo): Devuelve un stream con tantos elementos como el valor pasado como parámetro
  • map(Function<? super T>, ? extends R> mapeador): Devuelve un stream cuyo elementos será el resultado de la operación realizada sobre los elementos del stream original
  • peek(Consumer<? super T> accion):
  • skip(long n): Elimina los \emph{n} primeros elementos y devuelve un stream con los restantes
  • sorted(Comparator<? super T> comparador): Devuelve un stream ordenado según el comparador que se pasa como parámetro
  • unordered(): Devuelve un stream desordenado

Operaciones finales

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

  • boolean allMatch(Predicate<? super T> predicado): Comprueba si todos los elementos del stream cumplen el predicado
  • boolean anyMatch(Predicate<? super T> predicado): Comprueba si algún elemento del stream cumple el predicado
  • boolean noneMatch(Predicate<? super T> predicado): Comprueba que ningún elemento del stream cumpla el predicado
  • Optional<T> findAny(): Devuelve un elemento cualquier del stream
  • Optional<T> findFirst(): Devuelve el primer elemento del stream
  • R collect(Collector<? super T,A,R> colector): Devuelve el stream como un tipo colección
  • long count(): Devuelve el número de elementos del stream
  • void forEach(Consumer<? super T> accion): Permite ejecutar una operación sobre cada uno de los elementos del stream
  • void forEachOrdered(Consumer<? super T> accion): Permite ejecutar una operación sobre cada uno de los elementos del

stream ordenado

  • Optional<T> max(Comparator<? super T> comparador): Devuelve el mayor de los elementos, según el comparador que se pasa

como parámetro

  • Optional<T> min(Comparator<? super T> comparador): Devuelve el menor de los elementos, según el comparador que se pasa

como parámetro

  • Object[] toArray(): Devuelve el stream como array de Objetos
  • Iterator<T> iterator(): Devuelve el stream como un Iterator

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

apuntes/streams.txt · Last modified: 2023/05/28 12:02 by Santiago Faci