Colecciones en Kotlin: List, Set y Map

video[Tutorial Colecciones en Kotlin: List, Set y Map

Una lista es una colección ordenada de elementos. Para trabajar con listas inmutables se utiliza la interface List. Extiende de la interfaz Collection, y define una serie de funciones propias, entre las que podemos destacar:

  •    get(index: Int): elemento almacenado en el índice especificado.
  •    indexOf(element: E): índice de la primera ocurrencia del elemento pasado como un argumento en la lista, o -1 si ninguno es encontrado.
  •    lastIndexOf(element: E): índice de la última ocurrencia del elemento pasado como un argumento en la lista, o -1 si ninguno es encontrado.
  •    listIterator(): iterador sobre los elementos en la lista.
  •    subList(fromIndex: Int, toIndex: Int): lista que contiene la porción de la lista entre los índices especificados de inicio y fin.

En Kotlin tenemos diversos modos de crear listas:

  •     listOf() permite crear una lista inmutable. Podremos tener todos los elementos de un mismo tipo o de diferentes tipos de datos:
val primos: List<Int> = listOf(2, 3, 5, 7)
val nombres: List<String> = listOf("Juan", "Roberto", "María")
val listaMezclada = listOf("Juan", 1, 2.445, 's') 
  •    emptyList() crea una lista inmutable vacía:
val listaVacia: List<String> = emptyList<String>() 
  •    listOfNotNull() crea una lista inmutable con solo elementos no nulos:
val listaNoNulos: List<Int> = listOfNotNull(2, 45, 2, null, 5, null) 
  •    arrayListOf() crea una lista inmutable de tipo ArrayList:
val arrayList: ArrayList<String> = arrayLis-tOf<String>("un", "dos", "tres)   
Para trabajar con listas mutables utiliza un desdendiente de MutableList. Esta interfaz extiende las interfaces MutableCollection y List discutidas anteriormen-te en esta sección. La interfaz MutableList agrega métodos para la recuperación o sustitución de un elemento basado en su posición:
  •    set(index: Int, element: E): sustituye un elemento en la lista, devolviendo el elemento que estaba previamente en la posición especificada.
  •    add(index: Int, element: E): inserta un elemento.
  •    removeAt(index: Int): elimina el elemento en un índice particular.
Para convertir una lista inmutable en mutable utiliza la función toMutableList(). Este método creará una nueva lista:
Para crear una lista mutable de un cierto tipo desde cero, por ejemplo, de String, usamos mutableListOf&lt;String&gt;(), mientras que para tipos mixtos podemos solo usar la función mutableListOf() en su lugar:
val listaMutable: MutableList<String> = mutableLis-tOf<String>("uno","dos")
listaMutable.add("tres")
listaMutable.removeAt(1)
listaMutable[0] = "cuatro" 
val mutableListMixed = mutableListOf("BMW", "Toyota", 1, 6.76, 'v')  

Conjuntos

Un conjunto (Set) es una colección sin orden de elementos únicos, esto es, no puede tener ningún duplicado. Set extiende de la interfaz Collection, por lo que es inmutable, y no agrega nuevos métodos. Para crear conjuntos inmutables utiliza:
  •    setOf() crea un conjunto inmutable y devuelve un objeto de tipo Set.
val conjunto: Set<Int> = setOf(1, 3, 4)
val conjuntoMezclado = setOf(2, 4.454, "casa", 'c')  

Mapas

Los mapas asocian claves con valores. Las claves deben ser únicas, pero los valores asociados no. De este modo, cada valor puede ser usado para identificar de manera única el valor asociado, ya que el mapa asegura que no puedes duplicar claves en la colección. Internamente, Kotlin usa la colección Java Map para implementar los mapas.
A diferencia de las interfaces List y Set en Kotlin que extienden la interfaz Collection, la interfaz Map no extiende nada. Algunas de las propiedades y funciones disponibles en esta interfaz se muestran a [g1] continuación. Observa como solo se permite hacer consultas, al definir una colección inmutable.  
  •    size: tamaño de la colección.
  •    isEmpty(): indica si el mapa está vacío.
  •    containsKey(key: K): indica si el mapa contiene una clave.
  •    containsValue(value: V): indica si el mapa contiene un valor.
  •    get(key: K): valor asociado a la llave dada o null si no se encuentra.
  •    keys: devuelve un Set inmutable con todas las claves en el mapa.
  •    values: Collection inmutable de todos los valores en el mapa.
mapOf() crea un mapa inmutable compuesto por una lista de pares, donde el primer valor es la clave, y el segundo es el valor. Devuelve un objeto de tipo Map.
val prefijos: Map<Int, String> = mapOf(34 to "España", 1 to "USA", 
                                                           233 to "Ghana")
for ((key, value) in prefijos) {
    println("$key es el código telefónico de $value")
}  
Podemos obtener el valor de una clave usando la función get(). También podemos usar los corchetes como un atajo para get().
print(prefijos.get(34)) // España
print(prefijos[34])     // España 
La interfaz MutableMap no extiende la interfaz MutableCollection; su único padre es la interfaz Map. Este anula las propiedades keys, entries y values de la interfaz padre para poder redefinirlas. Además, incluye algunas funciones extra como:
  •    put(key: K, value: V) inserta el par clave-valor en el mapa. Devolverá el valor previo enlazado con la clave o null si la clave no existía.
  •    remove(key: K) borra la clave y su valor enlazado.
  •    putAll(from: Map&lt;out K, V&gt;)  agrega nuevos pares clave-valor desde otro mapa. Si una clave ya existente será actualizada con el nuevo valor.
  •    clear() elimina todos los elementos del mapa.
mutableMapOf() permite crear un mapa mutable sin indicar la implementación:
val monedas: MutableMap<String, String> = mutableMapOf("euro" to "España", 
                                  "dolar" to "EEUU", "libra" to "UK")
println("Paises ${ monedas.values}") 
println("Monedas ${ monedas.keys}") 
monedas.put("cedi", "Ghana")
monedas.remove("dolar")  
Para indicar implementaciones específicas dispones de: hashMapOf() para crear un mapa de tipo LinkedHashMap., donde puedes consultar el orden en que los elementos fueron insertados, y sortedMapOf() para SortedMap, en el cual todas las entradas se almacenan en un orden de clave ascendente.