Convertir lista en mapa en Kotlin

David Mbochi Njonge 20 junio 2023
  1. Crear un proyecto de Kotlin
  2. Use el método asociado () para convertir la lista en mapa en Kotlin
  3. Use el método associateBy() para convertir la lista en mapa en Kotlin
  4. Utilice el método associateWith() para convertir la lista en mapa en Kotlin
  5. Use el método groupBy() para convertir la lista en mapa en Kotlin
  6. Conclusión
Convertir lista en mapa en Kotlin

Kotlin proporciona diferentes colecciones; los más comunes incluyen Lista, Mapa y Conjunto. A la hora de desarrollar aplicaciones, hay situaciones en las que nos vemos obligados a convertir un tipo de colección en otro para conseguir un objetivo concreto.

Por ejemplo, es posible que tenga una lista que contenga elementos duplicados y sabemos que un conjunto no permite elementos duplicados. Podemos convertir la lista en un conjunto y los duplicados se eliminarán sin escribir ninguna lógica.

Kotlin nos permite realizar estas operaciones al proporcionar diferentes métodos que podemos usar en las colecciones para convertir una colección en un tipo diferente de colección.

En este tutorial, aprenderemos las diferentes formas que podemos aprovechar para convertir una estructura de datos de lista en una estructura de datos de mapa.

Crear un proyecto de Kotlin

Abre IntelliJ y selecciona Nuevo > Archivo > Proyecto. En la ventana que se abre, ingrese el nombre del proyecto como “lista a mapa”, seleccione Kotlin en la sección Idioma e IntelliJ en la sección Sistema de compilación.

Finalmente, presiona el botón Crear para generar un proyecto Kotlin. Cree un archivo Main.kt en la carpeta kotlin y copie y pegue el siguiente código en el archivo.

data class Employee(val id: Number,
                    val firstName: String,
                    val email: String);

fun fetchEmployees(): List<Employee> {
    return listOf(
        Employee(1,"john", "john@gmail.com"),
        Employee(2,"mary","mary@gmail.com"),
        Employee(3,"jane","jane@gmail.com"),
        Employee(3,"abdul","abdul@gmail.com")
    );
}

En este ejemplo, hemos creado una clase de datos llamada Empleado que nos ayuda a crear una Lista de empleados Lista<Empleado> en el método fetchEmployees().

Usaremos el método fetchEmployees() en todos los ejemplos que cubriremos en este tutorial.

Use el método asociado () para convertir la lista en mapa en Kotlin

Copie y pegue el siguiente código en el archivo Main.kt después de la función fetchEmployees().

fun usingAssociate(employees: List<Employee>): Map<Number, String> {
    return employees.associate { employee ->
        Pair(employee.id, employee.email)
    }
}

fun main(){
    println(usingAssociate(fetchEmployees()));
}

En este ejemplo, hemos convertido nuestra lista en un mapa que contiene employee.id como clave y employee.email como cadena Map<Number, String>. Tenga en cuenta que el orden de inserción de nuestro mapa se mantiene como estaba en la lista.

El método associate() es una función de extensión de la interfaz Iterable que usa una función de transformación en los elementos de la lista para crear un par y devuelve este par como un mapa.

Tenga en cuenta que proporcionamos explícitamente los valores que queremos devolver como clave y valores en el par creado. Si se duplica la clave de un par, el par anterior se reemplaza por el par nuevo.

Por ejemplo, tenemos dos objetos en nuestra lista con el mismo id de 3, siendo el primero el de jane y el segundo el de abdul. Cuando los elementos se inserten en el mapa, jane será reemplazado por abdul.

Ejecute el código anterior y asegúrese de que el resultado sea como se muestra a continuación:

{1=john@gmail.com, 2=mary@gmail.com, 3=abdul@gmail.com}

Use el método associateBy() para convertir la lista en mapa en Kotlin

Comente el ejemplo anterior y copie y pegue el siguiente código en el archivo Main.kt después del comentario.

fun usingAssociateBy(employees: List<Employee>): Map<Number, Employee> {
    return employees.associateBy { employee: Employee ->
        employee.id
    }
}

fun main(){
    println(usingAssociateBy(fetchEmployees()));
}

En este ejemplo, hemos convertido una lista en un Mapa que contiene el employee.id como clave, y el objeto empleado tiene el valor Mapa<Número, Empleado>.

El método associateBy() es también una función de extensión de la interfaz Iterable. Solo necesitamos pasar el valor utilizado como clave en nuestro mapa.

La función keySelector obtiene esta clave de cada objeto de la lista y la aplica al mapa. Los valores del mapa se convierten en los objetos de nuestra lista.

Tenga en cuenta que la función keySelector recuperará dos duplicados con valor 3, como hemos visto anteriormente. El elemento antiguo será reemplazado por el elemento nuevo.

Ejecute este código y asegúrese de que el resultado sea como se muestra a continuación:

{1=Employee(id=1, firstName=john, email=john@gmail.com),
 2=Employee(id=2, firstName=mary, email=mary@gmail.com),
 3=Employee(id=3, firstName=abdul, email=abdul@gmail.com)}

Utilice el método associateWith() para convertir la lista en mapa en Kotlin

Comente el ejemplo anterior y copie y pegue el siguiente código en el archivo Main.kt después del comentario.

fun usingAssociateWith(employees: List<Employee>): Map<Employee, Number> {
    return employees.associateWith { employee ->
        employee.id
    }
}

fun main(){
    println(usingAssociateWith(fetchEmployees()));
}

En este ejemplo, hemos convertido una lista en un mapa que contiene el objeto empleado como clave y el employee.id como valor Map<Employee, Number> .

El método associateWith() es una función de extensión de la interfaz Iterable, y solo necesitamos pasar el elemento que se usará como valor en nuestro mapa. La función valueSelector obtiene los valores de cada objeto de nuestra lista y los aplica a nuestro mapa.

Las claves del mapa se convierten en los elementos de nuestra lista. Como los objetos son claves en el mapa, no tendremos duplicados, pero dos elementos en nuestro mapa tendrán el valor 3.

Ejecute este código y asegúrese de que el resultado sea como se muestra a continuación:

{Employee(id=1, firstName=john, email=john@gmail.com)=1,
 Employee(id=2, firstName=mary, email=mary@gmail.com)=2,
 Employee(id=3, firstName=jane, email=jane@gmail.com)=3,
 Employee(id=3, firstName=abdul, email=abdul@gmail.com)=3}

Use el método groupBy() para convertir la lista en mapa en Kotlin

Comente el ejemplo anterior y copie y pegue el siguiente código en el archivo Main.kt después del comentario.

fun usingGroupBy(employees: List<Employee>): Map<Number, List<Employee>> {
    return employees.groupBy { employee: Employee ->
        employee.id
    }
}

fun main(){
    println(usingGroupBy(fetchEmployees()));
}

En nuestros primeros ejemplos, hemos visto que los duplicados se reemplazan al convertir una lista en un mapa. En situaciones en las que desea mantener los duplicados, utilizamos el método groupBy().

En este ejemplo, hemos convertido una lista en un mapa que contiene la clave como employee.id, y los valores son una lista de objetos de empleados agrupados por su id Map<Number, List<Employee>> .

El método groupBy() también es una función de extensión de la interfaz Iterable y solo requiere que pasemos el valor utilizado como clave en nuestro mapa. La función keySelector de este método obtiene la clave de cada objeto de la lista y la aplica a nuestro mapa.

Los objetos que tienen la misma identificación se agrupan en una lista. Ejecute este código y asegúrese de que el resultado sea como se muestra a continuación.

{1=[Employee(id=1, firstName=john, email=john@gmail.com)],
 2=[Employee(id=2, firstName=mary, email=mary@gmail.com)],
 3=[Employee(id=3, firstName=jane, email=jane@gmail.com),
    Employee(id=3, firstName=abdul, email=abdul@gmail.com)]}

Conclusión

En este tutorial, hemos aprendido cómo convertir una lista en un mapa aprovechando diferentes funciones de extensión de la interfaz Iterable. Los métodos que hemos cubierto incluyen el uso del método associate(), el método associateBy(), el método associateWith() y el método groupBy().

Tenga en cuenta que hay otras estrategias de agrupación que puede utilizar, como groupingBy() y groupByTo().

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

Artículo relacionado - Kotlin List