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.
distinct()
: Devuelve un stream con los elementos distintosfilter(Predicate<? super T> predicado)
: Devuelve un stream con los elementos que cumplen el filtro pasado como parámetrolimit(long tamanoMaximo)
: Devuelve un stream con tantos elementos como el valor pasado como parámetromap(Function<? super T>, ? extends R> mapeador)
: Devuelve un stream cuyo elementos será el resultado de la operación realizada sobre los elementos del stream originalpeek(Consumer<? super T> accion)
:skip(long n)
: Elimina los \emph{n} primeros elementos y devuelve un stream con los restantessorted(Comparator<? super T> comparador)
: Devuelve un stream ordenado según el comparador que se pasa como parámetrounordered()
: 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 predicadoboolean anyMatch(Predicate<? super T> predicado)
: Comprueba si algún elemento del stream cumple el predicadoboolean noneMatch(Predicate<? super T> predicado)
: Comprueba que ningún elemento del stream cumpla el predicadoOptional<T> findAny()
: Devuelve un elemento cualquier del streamOptional<T> findFirst()
: Devuelve el primer elemento del streamR collect(Collector<? super T,A,R> colector)
: Devuelve el stream como un tipo colecciónlong count()
: Devuelve el número de elementos del streamvoid forEach(Consumer<? super T> accion)
: Permite ejecutar una operación sobre cada uno de los elementos del streamvoid 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 ObjetosIterator<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