apuntes:streams
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
Next revision | |||
— | apuntes:streams [2021/03/10 13:13] – created Santiago Faci | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Streams ====== | ||
+ | \section{¿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. | ||
+ | |||
+ | \section{Cómo crear Streams} | ||
+ | |||
+ | Los \emph{streams} se pueden generar llamando al método \verb stream() | ||
+ | \verb java.util.Collection | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | List< | ||
+ | listaAnimales.add(. . .); | ||
+ | listaAnimales.add(. . .); | ||
+ | listaAnimales.add(. . .); | ||
+ | Stream< | ||
+ | \end{lstlisting} | ||
+ | |||
+ | También se pueden crear a partir de objetos de forma individual, sin partir de ninguna colección ya existente: | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | Stream< | ||
+ | \end{lstlisting} | ||
+ | |||
+ | Y también se puede crear un stream a partir de un array: | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | String[] nombres = {" | ||
+ | Stream< | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \section{Operaciones intermedias} | ||
+ | |||
+ | Son aquellas operaciones que siempre acaban devolviendo el stream modificado. | ||
+ | |||
+ | \begin{itemize} | ||
+ | \item \textbf{distinct()}: | ||
+ | \item \textbf{filter(Predicate<? | ||
+ | \item \textbf{limit(long tamanoMaximo)}: | ||
+ | \item \textbf{map(Function<? | ||
+ | realizada sobre los elementos del stream original | ||
+ | \item \textbf{peek(Consumer<? | ||
+ | \item \textbf{skip(long n)}: Elimina los \emph{n} primeros elementos y devuelve un stream con los restantes | ||
+ | \item \textbf{sorted(Comparator<? | ||
+ | \item \textbf{unordered()}: | ||
+ | \end{itemize} | ||
+ | |||
+ | \section{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<? | ||
+ | \item \textbf{boolean anyMatch(Predicate<? | ||
+ | \item \textbf{boolean noneMatch(Predicate<? | ||
+ | \item \textbf{Optional< | ||
+ | \item \textbf{Optional< | ||
+ | \item \textbf{R collect(Collector<? | ||
+ | \item \textbf{long count()}: Devuelve el número de elementos del stream | ||
+ | \item \textbf{void forEach(Consumer<? | ||
+ | \item \textbf{void forEachOrdered(Consumer<? | ||
+ | stream ordenado | ||
+ | \item \textbf{Optional< | ||
+ | como parámetro | ||
+ | \item \textbf{Optional< | ||
+ | como parámetro | ||
+ | \item \textbf{Object[] toArray()}: Devuelve el stream como array de Objetos | ||
+ | \item \textbf{Iterator< | ||
+ | \end{itemize} | ||
+ | |||
+ | Veamos algunos ejemplos para la siguiente colección: | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | List< | ||
+ | numeros.add(" | ||
+ | numeros.add(" | ||
+ | numeros.add(" | ||
+ | numeros.add(" | ||
+ | numeros.add(" | ||
+ | numeros.add(" | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | numeros.stream() | ||
+ | .filter(nombre -> nombre.startsWith(" | ||
+ | .forEach(System.out:: | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \begin{verbatim} | ||
+ | cinco | ||
+ | cuatro | ||
+ | cinco | ||
+ | \end{verbatim} | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | numeros.stream() | ||
+ | .distinct() | ||
+ | .filter(nombre -> nombre.startsWith(" | ||
+ | .forEach(System.out:: | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \begin{verbatim} | ||
+ | cuatro | ||
+ | cinco | ||
+ | \end{verbatim} | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | numeros.stream() | ||
+ | .filter(nombre -> nombre.startsWith(" | ||
+ | .peek(nombre -> System.out.println(nombre.length())) | ||
+ | .forEach(System.out:: | ||
+ | \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(" | ||
+ | .forEachOrdered(System.out:: | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \begin{verbatim} | ||
+ | 3 | ||
+ | 3 | ||
+ | 5 | ||
+ | cinco | ||
+ | 4 | ||
+ | 6 | ||
+ | cuatro | ||
+ | 5 | ||
+ | cinco | ||
+ | \end{verbatim} | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | Optional< | ||
+ | System.out.println(primerNumero.get()); | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \begin{verbatim} | ||
+ | uno | ||
+ | \end{verbatim} | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | Optional< | ||
+ | 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:: | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \begin{verbatim} | ||
+ | tres | ||
+ | cinco | ||
+ | cuatro | ||
+ | dos | ||
+ | cinco | ||
+ | uno | ||
+ | \end{verbatim} | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | // Orden garantizado | ||
+ | numeros.stream().parallel().forEachOrdered(System.out:: | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \begin{verbatim} | ||
+ | uno | ||
+ | dos | ||
+ | cinco | ||
+ | tres | ||
+ | cuatro | ||
+ | cinco | ||
+ | \end{verbatim} | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | Optional< | ||
+ | \end{lstlisting} | ||
+ | |||
+ | \begin{verbatim} | ||
+ | tres | ||
+ | \end{verbatim} | ||
+ | |||
+ | \begin{lstlisting}[language=java] | ||
+ | List< | ||
+ | .sorted(Comparator.comparing(nombre:: | ||
+ | .collect(Collectors.toList()); | ||
+ | \end{lstlisting} |
apuntes/streams.txt · Last modified: 2023/05/28 12:02 by Santiago Faci