Listas en Kotlin

En el capítulo anterior hablamos sobre los arrays o arreglos y vimos todo el potencial que tenía, pero uno de los mayores inconvenientes era la limitación al definirlos, puesto que teníamos que saber de ante mano el tamaño de dicho array.

Tipos de listas

Las colecciones se pueden clasificar en dos grandes grupos, las mutables e inmutables. Es decir, las que se pueden editar (mutables) y las que son solo de lectura (inmutable).

Listas inmutables

La declaración de una lista inmutable sería así.

val readOnly: List<String> = listOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")

Existen varias funciones útiles para trabajar con ellas.

val readOnly: List<String> = listOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")

readOnly.size //Muestra el tamaño de la lista
readOnly.get(3) //Devuelve el valor de la posición 3
readOnly.first() //Devuelve el primer valor
readOnly.last() //Devuelve el último valor
println(readOnly) //[Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo]

Como pueden ver podemos trabajar completamente con ellas, a excepción de añadir más elementos.

También podemos filtrar usando el patrón iterator, que es un mecanismo para acceder a los elementos de la lista, por ejemplo .first() o .last()

val a = readOnly.filter { it == "Lunes" || it == "Juernes" }

El .filter nos permite filtrar en la lista a través de una o varias condiciones que pongamos. Para ello llamamos a it (iterator) y buscaremos en la lista, si contiene la palabra «Lunes» o «Juernes«. En este caso solo pintará «Lunes«.

Listas mutables

Ahora nos toca hablar de las más interesantes, las listas mutables, que poseen todo lo anterior, pero también nos da la posibilidad de ir rellenando la lista a medida que lo necesitemos, el único inconveniente es que más ineficiente con la memoria.

var mutableList: MutableList<String> = mutableListOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado")

    println(readOnly) //[Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]

    mutableList.add("domingo")

La definición es muy similar, a través de la función mutableListOf. Ahora si os fijáis he añadido de lunes a sábado que será lo que pintará, luego, usando mutableList.add he añadido el domingo.

Por defecto los valores se irán añadiendo en la última posición, pero podemos añadir el índice en el que queramos escribir nuestro valor.

mutableList.add(0, "Semana: ")

Con esto, si pintásemos la lista nos mostraría lo siguiente.

[Semana: , Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, domingo]

Ahora tenemos que tener cuidado con una lista mutable por el simple hecho de que podría estar vacía o contener un null. Un null es un valor nulo en una de sus posiciones, que, si acedemos a él e intentamos operar, la aplicación se romperá, nos saltará un crash. Para ello, tenemos algunas funciones que nos permitirá trabajar como una lista inmutable, pero con seguridad.

var mutableList: MutableList<String> = mutableListOf()

   mutableList.none() //Nos devuelve un true si está vacía la lista
   mutableList.firstOrNull() //Nos devolverá el primer campo, y si no hay, un null.
   mutableList.elementAtOrNull(2) //El elemento del índice 2, si no hay, devolverá un null
   mutableList.lastOrNull() //Último valor de la lista o null

En este ejemplo he instanciado una lista sin valor alguno, por lo que está vacía. Con todos esos métodos recuperaremos un null (menos el primero que dará true) y la aplicación seguirá corriendo, si por le contrario hubiera puesto un .first() nos hubiese pasado lo siguiente.

curso de programación kotlin

Debemos de tener mucho cuidado a la hora de trabajar con datos que puedan mutar.

Recorriendo listas

Igual que hicimos en el capítulo de las arrays, aquí también tenemos formas (muy similares) para recorrer las listas.

Esta sería la forma más sencilla, y nos devolvería el contenido de cada uno de los valores de la lista.

for (item in mutableList) {
      print(item)
  }

Si necesitamos saber también la posición de cada uno de los valores podemos usar la función .withIndex que nos permite generar 2 variables, la primera será la posición y la segunda el contenido.

for ((indice, item) in mutableList.withIndex()) {
      println("La posición $indice contiene $item")
  }

Para el último ejemplo, usaremos .forEach, una función que hará que por cada posición haga una cosa, por ejemplo pintar el valor como el for anterior. A diferencia de ellos, no tenemos una variable con el contenido (véase índice e item) sino que accedemos a él con el iterator, en este caso simplemente habría que poner it.

En este ejemplo imaginemos que queremos añadir a los días de la semana dos puntos «:» así que vamos a crear una nueva lista (mutable) e iremos rellenando la lista a través del forEach.

val mutableList: MutableList<String> = mutableListOf("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado")
  val newListEmpty: MutableList<String> = mutableListOf()

  mutableList.forEach {
      newListEmpty.add(it+":")
  }

  print(newListEmpty)

Continúa con el curso: Capítulo 11 – Configurando Android Studio para Kotlin