Kotlin MutableList: cómo crear una lista vacía sin volverse loco

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: La paradoja de la lista vacía en Kotlin

\n\n

Imagina: estás escribiendo en Kotlin y necesitas crear una lista que se completará dinámicamente. Sabes que List es una colección inmutable y que MutableList es justo lo que recetó el doctor. Pero en cuanto escribes val list = MutableList(), el compilador te da un error. ¿Te suena?

\n\n

Esta pregunta es una de las más populares en Stack Overflow entre los principiantes en Kotlin (y no solo). Miles de desarrolladores tropiezan con la misma piedra: ¿cómo inicializar correctamente un MutableList vacío? Parece un detalle, pero sin esto no funciona ningún algoritmo dinámico.

\n\n

En este artículo, analizaremos todas las formas legales de crear una lista mutable vacía en Kotlin. Desde trucos simples hasta técnicas avanzadas. Aprenderás por qué mutableListOf() es tu mejor amigo y ArrayList() es un compañero viejo pero confiable. ¡Allá vamos!

\n\n

1. ¿Por qué simplemente MutableList() no funciona?

\n\n

Vamos a desmentir el mito de inmediato. Si intentas escribir:

\n\n
// ¡Error de compilación!\nval list = MutableList()
\n\n

El compilador se quejará con razón. ¿Por qué? Porque MutableList es una interfaz, no una clase concreta. Una interfaz no se puede instanciar. Es como intentar crear "simplemente un automóvil" sin especificar la marca y el modelo. Kotlin requiere una implementación concreta.

\n\n

Afortunadamente, tenemos varias formas elegantes de sortear esta limitación.

\n\n

2. La forma más simple: mutableListOf()

\n\n

Este es el rey de las listas vacías. Una función de fábrica estándar de la biblioteca estándar de Kotlin:

\n\n
val emptyList = mutableListOf<String>()\nprintln(emptyList) // Salida: []\nprintln(emptyList.size) // Salida: 0
\n\n

Por qué es genial:

\n
    \n
  • No es necesario especificar el tipo si se puede inferir del contexto
  • \n
  • Crea un MutableList con tipo ArrayList internamente
  • \n
  • Se lee como "crea una lista mutable a partir de nada"
  • \n
\n\n

Añadir elementos es un placer:

\n\n
val numbers = mutableListOf<Int>()\nnumbers.add(1)\nnumbers.add(2)\nnumbers.add(3)\nprintln(numbers) // [1, 2, 3]
\n\n

Este método es adecuado para el 90% de los casos. Recuérdalo como el principal.

\n\n

3. El clásico ArrayList() — el regreso del rey

\n\n

Si vienes de Java, esta forma te resultará familiar. Kotlin es totalmente compatible con Java Collections Framework, por lo que puedes usar ArrayList directamente:

\n\n
val list = ArrayList<String>()\nprintln(list) // []
\n\n

Pero hay un detalle: ArrayList es una implementación concreta de la interfaz MutableList. Si más adelante quieres cambiar la implementación (por ejemplo, a LinkedList), tendrás que cambiar el tipo de la variable. En ese sentido, mutableListOf() es más flexible, ya que devuelve un MutableList.

\n\n

Cuándo usar ArrayList():

\n
    \n
  • Cuando necesitas el máximo rendimiento (ArrayList es más rápido que LinkedList para acceso por índice)
  • \n
  • Cuando trabajas con bibliotecas Java que esperan específicamente un ArrayList
  • \n
  • Cuando eliges conscientemente una implementación concreta
  • \n
\n\n

4. La forma astuta: MutableList(size) { defaultValue }

\n\n

A veces una lista vacía no es del todo "vacía". A veces necesitas crear una lista con un tamaño conocido de antemano, pero con valores vacíos. Para eso existe una sobrecarga del constructor:

\n\n
// Creamos una lista de 5 elementos, cada uno es una cadena vacía\nval list = MutableList(5) { "" }\nprintln(list) // [, , , , ]\nprintln(list.size) // 5
\n\n

No es exactamente una lista vacía, sino una lista inicializada con "valores vacíos". Es útil cuando sabes exactamente la cantidad de elementos, pero los sobrescribirás.

\n\n

Para un cero absoluto, usa

Blogs

Book Recommendations