This is an old revision of the document!
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.
\begin{itemize}
\item \textbf{boolean allMatch(Predicate<? super T> predicado)}: Comprueba si todos los elementos del stream cumplen el predicado \item \textbf{boolean anyMatch(Predicate<? super T> predicado)}: Comprueba si algún elemento del stream cumple el predicado \item \textbf{boolean noneMatch(Predicate<? super T> predicado)}: Comprueba que ningún elemento del stream cumpla el predicado \item \textbf{Optional<T> findAny()}: Devuelve un elemento cualquier del stream \item \textbf{Optional<T> findFirst()}: Devuelve el primer elemento del stream \item \textbf{R collect(Collector<? super T,A,R> colector)}: Devuelve el stream como un tipo colección \item \textbf{long count()}: Devuelve el número de elementos del stream \item \textbf{void forEach(Consumer<? super T> accion)}: Permite ejecutar una operación sobre cada uno de los elementos del stream \item \textbf{void forEachOrdered(Consumer<? super T> accion)}: Permite ejecutar una operación sobre cada uno de los elementos del stream ordenado \item \textbf{Optional<T> max(Comparator<? super T> comparador)}: Devuelve el mayor de los elementos, según el comparador que se pasa como parámetro \item \textbf{Optional<T> min(Comparator<? super T> comparador)}: Devuelve el menor de los elementos, según el comparador que se pasa como parámetro \item \textbf{Object[] toArray()}: Devuelve el stream como array de Objetos \item \textbf{Iterator<T> iterator()}: Devuelve el stream como un Iterator
\end{itemize}
Veamos algunos ejemplos para la siguiente colección:
\begin{lstlisting}[language=java] List<String> numeros = new ArrayList<>(); numeros.add(“uno”); numeros.add(“dos”); numeros.add(“cinco”); numeros.add(“tres”); numeros.add(“cuatro”); numeros.add(“cinco”); \end{lstlisting}
\begin{lstlisting}[language=java] numeros.stream()
.filter(nombre -> nombre.startsWith("c")) .forEach(System.out::println);
\end{lstlisting}
\begin{verbatim} cinco cuatro cinco \end{verbatim}
\begin{lstlisting}[language=java] numeros.stream()
.distinct() .filter(nombre -> nombre.startsWith("c")) .forEach(System.out::println);
\end{lstlisting}
\begin{verbatim} cuatro cinco \end{verbatim}
\begin{lstlisting}[language=java] numeros.stream()
.filter(nombre -> nombre.startsWith("c")) .peek(nombre -> System.out.println(nombre.length())) .forEach(System.out::println);
\end{lstlisting}
\begin{verbatim} 5 cinco 6 cuatro 5 cinco \end{verbatim}
\begin{lstlisting}[language=java] numeros.stream()
.peek(nombre -> System.out.println(nombre.length())) .filter(nombre -> nombre.startsWith("c")) .forEachOrdered(System.out::println);
\end{lstlisting}
\begin{verbatim} 3 3 5 cinco 4 6 cuatro 5 cinco \end{verbatim}
\begin{lstlisting}[language=java] Optional<String> primerNumero = numeros.stream().findAny(); System.out.println(primerNumero.get()); \end{lstlisting}
\begin{verbatim} uno \end{verbatim}
\begin{lstlisting}[language=java] Optional<String> primerNumero = numeros.stream().findFirst(); System.out.println(primerNumero.get()); \end{lstlisting}
\begin{verbatim} uno \end{verbatim}
\begin{lstlisting}[language=java] Orden no garantizado numeros.stream().parallel().forEach(System.out::println); \end{lstlisting} \begin{verbatim} tres cinco cuatro dos cinco uno \end{verbatim} \begin{lstlisting}[language=java] Orden garantizado numeros.stream().parallel().forEachOrdered(System.out::println); \end{lstlisting}
\begin{verbatim} uno dos cinco tres cuatro cinco \end{verbatim}
\begin{lstlisting}[language=java] Optional<String> primerNumero = numeros.stream().parallel().findAny(); \end{lstlisting}
\begin{verbatim} tres \end{verbatim}
\begin{lstlisting}[language=java] List<String> numeros = numeros.stream()
.sorted(Comparator.comparing(nombre::length) .collect(Collectors.toList());
\end{lstlisting}
© 2021 Santiago Faci