A logo showing the text blog.marcnuri.com
English
Inicio»Java»Java 8 Streams: Convertir List en Map

Entradas Recientes

  • Fabric8 Kubernetes Client 7.2.0 está disponible!
  • Conectarse a un servidor MCP con JavaScript y AI SDK
  • Conectarse a un servidor MCP con JavaScript y LangChain.js
  • El Futuro de las Herramientas para Desarrolladores en la era de la IA
  • Conectarse a un servidor Model Context Protocol (MCP) con Java y LangChain4j

Categorías

  • Antiguo
  • Front-end
  • Go
  • Herramientas
  • Industria y negocios
  • Inteligencia Artificial
  • Java
  • JavaScript
  • Operaciones
  • Personal
  • Proyectos personales

Archivos

  • mayo 2025
  • abril 2025
  • marzo 2025
  • febrero 2025
  • enero 2025
  • diciembre 2024
  • noviembre 2024
  • agosto 2024
  • junio 2024
  • mayo 2024
  • abril 2024
  • marzo 2024
  • febrero 2024
  • enero 2024
  • diciembre 2023
  • noviembre 2023
  • octubre 2023
  • septiembre 2023
  • agosto 2023
  • julio 2023
  • junio 2023
  • mayo 2023
  • abril 2023
  • marzo 2023
  • febrero 2023
  • enero 2023
  • diciembre 2022
  • noviembre 2022
  • octubre 2022
  • agosto 2022
  • julio 2022
  • mayo 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • diciembre 2020
  • octubre 2020
  • agosto 2020
  • junio 2020
  • mayo 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • noviembre 2019
  • octubre 2019
  • julio 2019
  • diciembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • marzo 2018
  • febrero 2018
  • noviembre 2017
  • octubre 2017
  • agosto 2017
  • julio 2017
  • enero 2017
  • julio 2016
  • enero 2016
  • diciembre 2015
  • noviembre 2015
  • diciembre 2014
  • marzo 2014
  • febrero 2011
  • junio 2008
  • mayo 2008
  • abril 2008
  • enero 2008
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007

Java 8 Streams: Convertir List en Map

2018-03-28 en Java etiquetado Collector / Java / Java 8 / List / Map / Streams por Marc Nuri | Última actualización: 2021-03-20
English version

Introducción

En esta publicación veremos como emplear los streams introducidos en Java 8 para obtener un Map a partir de un List.

Los mapas son estructuras de datos compuestas por una colección de elementos clave-valor de forma que una clave sólo puede existir de forma única dentro de la colección. Esto nos permite realizar búsquedas de elementos de forma muy rápida a partir de su clave sin necesidad de recorrer la colección completa.

Es muy común que al enfrentarnos con algún problema partamos de una lista de elementos y queramos obtener un mapa de forma que podamos optimizar el algoritmo para la resolución del mismo. Es en estas ocasiones donde los streams de Java 8 nos permiten hacer esta conversión de forma rápida y elegante.

En esta publicación veremos como convertir una lista de repositorios de Github en un mapa. Para ello partimos de la clase GithubRepo.

1/** ... **/
2public class GithubRepo {
3  private String name;
4  @JsonProperty("full_name")
5  private String fullName;
6  private String description;
7  private Boolean fork;
8  @JsonIgnore
9  private Integer localVersion;
10  /** ... **/
11}

Lista a Mapa sin duplicidades

Si estamos seguros de que la lista que queremos convertir a un Map no contiene elementos duplicados, podemos emplear el siguiente código:

1repos.stream().collect(Collectors.toMap(GithubRepo::getName, Function.identity()));

El primer paso es convertir la lista en un Stream y seguidamente, sin hacer ninguna transformación, recoger los resultados con uno de los Collectors que ofrece Java 8 por defecto.

Como clave para el mapa vamos a emplear el nombre del repositorio en este caso utilizamos el código GithubRepo::getName que sería el equivalente recomendado a la expresión gr -> gr.getName(). Como valor del mapa utilizaremos el propio objeto de la lista, para ello java nos ofrece Function.identity() que sería el equivalente recomendado a la expresión gr -> gr.

Como hemos dicho, una de las premisas fundamentales de este Collector es que no haya claves duplicadas dentro de la lista inicial. En el caso de recibir una duplicidad, se lanzaría un IllegalStateException como puede comprobarse en el test listToMap_duplicatesList_shouldThrowException.

Lista a Mapa con claves duplicadas

En el caso en el que no estemos seguros o sepamos que la lista inicial va a contener duplicidades emplearemos otro Collector que nos permite gestionar estas duplicidades. En este caso debemos pasar una función adicional que se encargará de fusionar los elementos duplicados.

1repos.stream().collect(Collectors.toMap(GithubRepo::getName, Function.identity(),
2  (ghrPrevious, ghrNew) -> ghrNew));

En la función toMap, aportamos un tercer parámetro que a partir de 2 elementos iniciales ghrPrevious y ghrNew debe de retornar un único elemento del mismo tipo. En este caso estamos devolviendo el más nuevo de los dos, aunque podría devolverse el más antiguo o una transformación sobre alguno de ellos o sobre uno nuevo.

Lista a Mapa manteniendo orden de claves

Collectors.toMap admite un parámetro adicional donde podemos especificar el constructor del Mapa que devolverá la función.

1repos.stream().collect(Collectors.toMap(GithubRepo::getName, Function.identity(),
2        (ghrPrevious, ghrNew) -> ghrNew, TreeMap::new));

En este caso indicamos que queremos obtener un Map como instancia de TreeMap que implementa la interfaz SortedMap. Este tipo de mapa está ordenado por el orden natural de sus claves o por el orden especificado en el comparador de claves suministrado como argumento al constructor.

En el caso anterior, el mapa estará ordenado por el orden alfabético de las claves, en el siguiente código lo ordenaríamos por el orden inverso al emplear Comparator.reverseOrder():

1repos.stream().collect(Collectors.toMap(GithubRepo::getName, Function.identity(),
2        (ghrPrevious, ghrNew) -> ghrNew,
3        () -> new TreeMap(Comparator.reverseOrder())));

Conclusión

En esta publicación hemos visto como podemos pasar de forma sencilla una estructura de datos de tipo lista a un mapa empleando streams de Java 8 y la función Collectors.toMap.

El código fuente completo de este artículo puede encontrarse en GitHub.

Java 8 Streams
Java 8 Streams
Twitter iconFacebook iconLinkedIn iconPinterest iconEmail icon

Navegador de artículos
Java 10: Probando las nuevas funcionalidadesSpring Data MongoDB: Implementación de un repositorio a medida
© 2007 - 2025 Marc Nuri