Las listas en Kotlin son parte fundamental de las 'collections' y se dividen en dos grandes tipos: listas mutables e inmutables. Las listas inmutables son aquellas cuyos elementos no pueden ser modificados, eliminados o añadidos después de su creación. Por el contrario, las listas mutables permiten dichos cambios. Al entender estas diferencias, podemos manipular datos de manera más eficaz y adaptada a nuestras necesidades.
Aquí un ejemplo de cómo se declara una lista inmutable en Kotlin:
val listaNombres =listOf("Juan","Enrique","Camila")
¿Cómo funcionan las listas inmutables?
Crear una lista inmutable es sencillo y permite almacenar elementos de tipo determinado. Una vez establecidos, estos elementos no se pueden modificar. Por ejemplo, no podemos eliminar un elemento de listaNombres pues es inmutable.
Intentar eliminar elementos en una lista inmutable lleva a errores, lo cual garantiza la integridad de los datos cuando no necesitamos cambios posteriores.
¿Cómo se declaran las listas mutables?
Las listas mutables son aquellas donde podemos agregar, eliminar o modificar elementos a petición. Su declaración es similar a las listas inmutables, con la diferencia de usar mutableListOf.
val listaVacia = mutableListOf<String>()
Esta lista originalmente está vacía, pero podemos añadir elementos utilizando la función .add().
listaVacia.add("Juan")
Manipulación de listas en Kotlin
Existen múltiples funciones que nos facilitan la manipulación de listas, como obtener valores mediante índices o eliminar elementos según condiciones.
¿Cómo obtener un valor de una lista?
Para obtener el primer valor de una lista, podemos usar directamente índices o la función .get().
val valor = listaVacia[0]// Usando índicesval valorUsandoGet = listaVacia.get(0)// Usando get()
Ambas formas son válidas en Kotlin y dependen de tu preferencia personal.
¿Cómo se utilizan funciones avanzadas como .first y .removeIf?
Kotlin ofrece funciones avanzadas que permiten realizar búsquedas con condiciones específicas y eliminar elementos basados en dichas condiciones.
.first y .firstOrNull(): Obtienen el primer elemento que cumple con una condición. Si el elemento no existe, .firstOrNull() devuelve nulo, ayudando a evitar excepciones.
val primerNombre = listaNombres.firstOrNull{ it.length >4}?:"Ninguno"
.removeIf: Elimina elementos basados en una condición definida.
listaVacia.removeIf{ it.length >3}
¿Cuál es la diferencia entre listas y arrays en Kotlin?
Los arrays, aunque menos flexibles que las listas, pueden ser más óptimos en ciertas situaciones de alto rendimiento. Sin embargo, tienen limitaciones significativas en cuanto a las funciones disponibles y la capacidad de mutabilidad.
¿Por qué preferir listas a arrays?
Aunque los arrays proveen una estructura de datos eficiente, la falta de funciones avanzadas y la complejidad para su manipulación visual los hacen menos deseables. Kotlin recomienda usar listas por sus ventajas funcionales a menos que se requiera procesamiento intensivo.
val miArray =arrayOf(1,2,3,4)val miLista = miArray.toList()// Convertir un array a lista para beneficiarse de sus funciones
La flexibilidad de las listas en Kotlin las convierte en una herramienta poderosa para la gestión de datos, por lo que, en la mayoría de los casos, se recomienda su uso sobre arrays. Aprender a trabajar con estas estructuras te permitirá escribir código más eficiente y robusto. ¡Sigue explorando las 'collections' en Kotlin y potencia tus habilidades de programación!
++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 listareadOnly.get(3)//Devuelve el valor de la posición 3readOnly.first()//Devuelve el primer valorreadOnly.last()//Devuelve el último valorprintln(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.
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.
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.
varmutableList: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
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)
Otra forma de imprimir un Array es usando la función joinToString la cual acepta varios parámetros que modifican el resultado por ejemplo:
separator: El carácter que va a separar los datos por defecto es la coma (,).
prefix: El carácter que va al inicio del array.
postfix: El carácter que va al final del array.
fun main(){val numeros =arrayOf(1,2,3,4)print(numeros.joinToString("-", “+”, “+”))//+1-2-3-4+}
Buena! Para crear un SQL string!
Hola Silvana gracias. Podrías decirme por favor de dónde tomas esas imagenes? he visto varias de ese estilo y no sé de qué curso o guía son
Excelente clase. Recuerden!
Las listas son inmutables, si queremos agregar, remover o usar funciones mas avanzadas necesitaremos una mutableList.
Podemos tener valores duplicados en una lista
Podemos recorrer todos los elementos de una lista
La principal diferencia entre una lista y un array es que la lista no puede actualizar ninguna de las referencias que almacena
disculpen mi ignoracia, a que se refiere con codigo performance? (13:19),
No es ignorancia, la única pregunta tonta es la que no se hace.
Es el código que tenemos que crear cuando estamos tocando una funcionalidad muy clave y que nos interesa mucho tenerla super optimizada. Tanto así que necesitamos invertir muchísimo tiempo y recursos para poder aumentar un pequeño porcentaje de velocidad y rendimiento. Esto suele verse sobretodo en Juegos, Renderizado de vídeo o reproducciones de video.
¿Quién no quiere que el programador dedique horas extras en lograr que tengas más FPS en tu juego :) ?
Al contrario, si lo que estás mostrando es una lista de la compra por ejemplo no será tan importante dedicar muchas horas y esfuerzo en hacerla tener un rendimiento máximo porque podrás dedicarle mucho tiempo pero no le verás tanta ganancia.
El desarrollo de software se trata de saber utilizar las herramientas correctas en el momento justo, todo es cuestión de revisar si compensa o no.
¿Por que es posible modificarse internamente el estado (tamaño) de listaVacia si es declarada con val y no var?
Hay una pregunta similar pero no quede claro con la respuesta.
Por lo que entendi es porque la variable esta declarada como val variable y una lista puede estar asignada a esa variable y modificarse siempre que la lista se mutableListOf casi que funcionan de manera independiente y en conjunto a la vez, variable y mutableLis
Segun entiendo, lo que pasa es que el contenido de la variable en el caso de las colecciones, tanto las listas como maps o sets, lo que se le asigna a la variable es una coleccion (no mutable o mutable), sin importar el contenido de la misma.
Por ende, cuando uno utiliza val en el caso de una lista mutable, no puede reasignar la variable (No puede asignarse una nueva lista u otro tipo de dato), pero si puede modificarse el contenido de esa misma lista.
val listaMutable =mutableListOf(1,2,3,4);
Por ejemplo, si declaras variable y le asignas una lista que tenga los valores de ahi arriba, y luego decidis que queres que tenga aparte de esos valores, el numero 5 tambien.
En ese caso solo podrias agregar ese valor con el metodo add
listaMutable.add(5);//Esto es correcto
Esto es correcto ya que el valor de la variable sigue siendo la misma lista. Lo que se hace es modificar el contenido de la lista.
Como la variable es tipo val, no podrias asignarle una nueva lista que tenga el valor 5
listaMutable =mutableListOf(1,2,3,4,5);//Esto es incorrecto
Corrección: el objeto listOf() sí tiene el método drop(n: Int) para eliminar los primeros n elementos. También tiene el método llamado dropLast(n: Int) para eliminar los últimos n elementos de la lista. dropWhile{} y dropLastWhile{} para eliminar los primeros y últimos, respectivamente, que satisfagan una condición booleana.
Buenas buenas! Una simple aclaración:
NO es bytecode lo que se imprime al imprimir un array completo sino:
[Ljava.lang.Integer; se refiere al tipo del objeto Array, donde L indica un objeto de referencia, java.lang.Integer es el nombre completo de la clase de los enteros en Java, y ; indica que es un arreglo de objetos.
@50040f0c es la dirección de memoria del objeto Array en formato hexadecimal.
Saludos!
Marian.
¿A que se refiere con utilizar un código "súper perfomance"?
que tiene que ser muy eficiente en términos de rapidez
Para el performance también podríamos utilizar secuencias. Antes de iniciar las operaciones con la lista la convertimos a secuencia, operamos en esa secuencia y finalmente la regresamos a lista al final de las operaciones.
Creo que esa era una de las dudas que tenía desde que empece con Kotlin
Los Arrays acá en Kotlin son para cosas en donde necesites una optimización superior o un gran cálculo.
Las List (mutables e inmutables) son para cosas mucho mas comunes y en la mayoría de las ocasiones es las que debes de ocupar por buenas prácticas.
<fun main(args:Array<String>){ val listaDeNombres =listOf("Juan","Enrique","Camila")println(listaDeNombres) val listaVacia = mutableListOf<String>()println(listaVacia) listaVacia.add("Juan")println(listaVacia) val valorUsandoGet = listaVacia.get(0)println(valorUsandoGet) val valorUsandoOperador = listaVacia[0]println(valorUsandoOperador) val primerValor:String?= listaDeNombres.firstOrNull()println(primerValor) listaVacia.removeAt(0)println(listaVacia) listaVacia.add("Enrique")println(listaVacia) listaVacia.removeIf{ caracteres -> caracteres.length>3}println(listaVacia) val myArray =arrayOf(1,2,3,4)println("Nuestro array $myArray")println("Array como lista ${myArray.toList()}")}>
Creo que en las nuevas versiones de Kotlin podemos usar la funcion de :
val myArray = arrayListOf<Int>(1,2,3,4)
Y nos imprime igual a que si utilizramos el "toList()"
Si está utilizando ARRAYS los datos se almacenarán de forma secuencial en el almacenamiento, es decir, se asignará un bloque continuo de almacenamiento para almacenar los datos. Pero si hablamos de LISTAS, entonces es una interfaz que puede tener diferentes implementaciones como ArrayList <T>, LinkedList <T>, etc. y la representación en memoria de estos List <T> depende de la implementación, es decir, si es ArrayList <T> o LinkedList <T> o algo más.
Supongamos en el futuro, si queremos cambiar un elemento por otro no podremos porque las List son de naturaleza inmutable. Por lo tanto, no puede actualizar los valores List <T>. Para actualizar los valores, debe usar MutableList <T>. En cambio los Arrays si pueden actualizar sus valores.
¿Qué pasa si en el futuro queremos agregar algunos elementos? En este caso, si estamos usando Arrays, entonces no podemos agregar ningún valor adicional a nuestra variable de cursos porque las matrices tienen un tamaño fijo y no podemos aumentar o disminuir el tamaño de una matriz.
Pero si usamos MutableList <T>, podemos agregar algunos valores usando el método add y eliminar algunos valores usando el método remove.
Entonces, estas son algunas de las diferencias entre una lista y una matriz. Si tiene datos de tamaño fijo, se pueden utilizar matrices. Si bien el tamaño de los datos puede variar, se pueden usar listas mutables.
Info:
MindOrks
¿Por qué me marca error en caracter al escribir esto en listaMutable.removeIf(caracter -> caracter.lenght>3) ? En el video no declaro caracteres y si funcionó pero a mi me sale error
Por lo que veo en la descripción escribiste "caracter.lenght" y creo también que no se usan paréntesis, si no llaves { } quedaría de la siguiente forma:
Para las listas mutables lo declaramos con var y las inmutables con val? En el video se coloca val en ambos casos. ¿Cuál sería la forma más conveniente?
En la mayoria de los casos lo mejor es usar unas listas con val. Si vas a usar una lista mutable o inmutable dependera de cada caso de uso :)
Con Kotlin es posible resolver ecuaciones y realizar cálculos de algebra lineal? Por otra parte, si se quisiera implementar en una app funciones de reconocimiento de imágenes, con Kotlin sería posible o habría que implementar algo de python?
👀 Si es posible tanto para operaciones simples como complejas. En este tutorial explican ello. Así como también con el análisis de imagenes aquí.
Disculpen mi ignorancia pero porque puede editar listaVacia si esta definida como "val"? no se supone que ya no se modifica?
Sí, es posible utilizar val para declarar una lista mutable en Kotlin. Esto se debe a que val solo hace inmutable a la variable en sí, no a los elementos contenidos en la colección.
Sin embargo, en mi punto de vista utilizaría Var para lista mutable, porque así tendria mas claridad y coherencia en el codigo.
Y que hay de los ArrayList<> ?
No son lo mejor de ambos mundos? XD pregunto en mi ignoracia, q tan eficiente es un ArrayList, en terminos de performance