Programación

1º DAM - Curso 2021-2022

User Tools

Site Tools


apuntes:streams

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: 2021/03/10 13:13 by Santiago Faci