Programación

1º DAM/DAW - Curso 2024-2025

User Tools

Site Tools


apuntes:streams

This is an old revision of the document!


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 distintos
  • filter(Predicate<? super T> 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<? super T>, ? extends R> mapeador): Devuelve un stream cuyo elementos será el resultado de la operación realizada sobre los elementos del stream original
  • peek(Consumer<? super T> accion):
  • skip(long n): Elimina los \emph{n} primeros elementos y devuelve un stream con los restantes
  • sorted(Comparator<? super T> 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.

\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

apuntes/streams.1634884431.txt.gz · Last modified: 2021/10/22 06:33 by Santiago Faci