Programación

1º DAM/DAW - Curso 2023-2024

User Tools

Site Tools


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()  de cualquiera de las implementaciones de la interfaz 
 +\verb java.util.Collection  .
 +
 +\begin{lstlisting}[language=java]
 +List<Animal> listaAnimales = new ArrrayList<>();
 +listaAnimales.add(. . .);
 +listaAnimales.add(. . .);
 +listaAnimales.add(. . .);
 +Stream<Animal> streamAnimales = listaAnimales.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<String> streamNombres = Stream.of("Juan", "Francisco", "Ana", "María");
 +\end{lstlisting}
 +
 +Y también se puede crear un stream a partir de un array:
 +
 +\begin{lstlisting}[language=java]
 +String[] nombres = {"Juan", "Francisco", "Ana", "María"};
 +Stream<String> streamNombres = Stream.of(nombres);
 +\end{lstlisting}
 +
 +\section{Operaciones intermedias}
 +
 +Son aquellas operaciones que siempre acaban devolviendo el stream modificado.
 +
 +\begin{itemize}
 +    \item \textbf{distinct()}: Devuelve un stream con los elementos distintos
 +    \item \textbf{filter(Predicate<? super T> predicado)}: Devuelve un stream con los elementos que cumplen el filtro pasado como parámetro
 +    \item \textbf{limit(long tamanoMaximo)}: Devuelve un stream con tantos elementos como el valor pasado como parámetro
 +    \item \textbf{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
 +    \item \textbf{peek(Consumer<? super T> accion)}: 
 +    \item \textbf{skip(long n)}: Elimina los \emph{n} primeros elementos y devuelve un stream con los restantes
 +    \item \textbf{sorted(Comparator<? super T> comparador)}: Devuelve un stream ordenado según el comparador que se pasa como parámetro
 +    \item \textbf{unordered()}: Devuelve un stream desordenado
 +\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<? 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}
apuntes/streams.txt · Last modified: 2023/05/28 12:02 by Santiago Faci