====== 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 listaAnimales = new ArrrayList<>(); listaAnimales.add(. . .); listaAnimales.add(. . .); listaAnimales.add(. . .); Stream streamAnimales = listaAnimales.stream(); También se pueden crear a partir de objetos de forma individual, sin partir de ninguna colección ya existente: Stream 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 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 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, ? extends R> mapeador)'': Devuelve un stream cuyo elementos será el resultado de la operación realizada sobre los elementos del stream original * ''peek(Consumer accion)'': * ''skip(long n)'': Elimina los \emph{n} primeros elementos y devuelve un stream con los restantes * ''sorted(Comparator 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 predicado)'': Comprueba si todos los elementos del stream cumplen el predicado * ''boolean anyMatch(Predicate predicado)'': Comprueba si algún elemento del stream cumple el predicado * ''boolean noneMatch(Predicate predicado)'': Comprueba que ningún elemento del stream cumpla el predicado * ''Optional findAny()'': Devuelve un elemento cualquier del stream * ''Optional findFirst()'': Devuelve el primer elemento del stream * ''R collect(Collector colector)'': Devuelve el stream como un tipo colección * ''long count()'': Devuelve el número de elementos del stream * ''void forEach(Consumer accion)'': Permite ejecutar una operación sobre cada uno de los elementos del stream * ''void forEachOrdered(Consumer accion)'': Permite ejecutar una operación sobre cada uno de los elementos del stream ordenado * ''Optional max(Comparator comparador)'': Devuelve el mayor de los elementos, según el comparador que se pasa como parámetro * ''Optional min(Comparator 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 iterator()'': Devuelve el stream como un Iterator Veamos algunos ejemplos para la siguiente colección: List 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 primerNumero = numeros.stream().findAny(); System.out.println(primerNumero.get()); uno Optional 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 primerNumero = numeros.stream().parallel().findAny(); tres List numeros = numeros.stream() .sorted(Comparator.comparing(nombre::length) .collect(Collectors.toList()); ---- (c) 2021-2023 Santiago Faci