Advertisement
  1. Code
  2. Kotlin
Code

Kotlin Desde Cero: Rangos y Colecciones

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Kotlin From Scratch.
Kotlin From Scratch: Nullability, Loops, and Conditions
Kotlin From Scratch: Packages and Basic Functions

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

Kotlin es una lenguaje moderno de programación que compila a código byte Java. Es gratuito y de código abierto, y promete hacer el codificar para Android incluso más divertido.

En el artículo anterior en esta serie, aprendiste sobre nulidad, ciclos, y condiciones en Kotlin. En este tutorial, continuaremos aprendiendo el lenguaje viendo la API de rangos y colecciones en Kotlin.

1. Rangos

Un Rango en Kotlin es un tipo único que define un valor de inicio y un valor final. En otras palabras, es un intervalo entre un valor de inicio y uno final. Los Rangos en Kotlin son cerrados, significando que el valor inicial y el valor final están incluidos en el rango.

Ahora veremos diferentes maneras de crear rangos en Kotlin.

El Operador ..

En el código de arriba, hemos creado un rango cerrado. Esta variable oneToFive incluirá los siguientes valores: 1, 2, 3, 4, 5. Podemos ciclar sobre este usando el constructor de ciclo for.

El código de arriba puede ser acortado a:

También podemos crear un rango de caracteres:

La variable aToZ tendrá todas las letras en el alfabeto Inglés.

La Función rangeTo()

El operador .. puede ser reemplazado con la función de extensión rangeTo() para crear un rango. Por ejemplo, también podemos hacer esto 1.rangeTo(5) y aún tener los mismos resultados que usar el operador .. como discutimos anteriormente.

La Función downTo()

Esta es otra función de extensión que creará un rango comenzando desde un número dado hacia otro.

Podemos modificar el rango usando la función step(). Esto modificará el delta entre cada elemento en el rango.

El código de arriba contendrá números impares entre 1 y 10.

El Operador in

El operador in es usado para cerciorarse si un valor está presente en un rango dado.

En el código de arriba, revisamos para ver si 5 está en el rango 1..10 usando el operador in. También podemos hacer lo contrario usando !n para revisar si 5 no está en el rango.

2. Colecciones

Las colecciones son usadas para almacenar grupos de objetos relacionados en memoria. En una colección, podemos recuperar, almacenar u organizar los objetos. Kotlin proporciona su API de colecciones como una librería estándar construida encima de la API de Colecciones Java. (Discutiremos interfaces en Kotlin en un artículo futuro.)

Deberías notar que estas interfaces están enlazadas a sus implementaciones en tiempo de compilación. No puedes ver el código fuente de implementación en Kotlin, porque sus colecciones son de hecho implementadas por las Colecciones Java estándar tales como ArrayListMapsHashMapSetsHashSetList y así por el estilo. Para entender realmente la API de colecciones en Kotlin, necesitarás estar familiarizado con las clases básicas e interfaces en Java.

En esta sección, aprenderemos sobre las colecciones List, Set y Map en Kotlin. (Si quieres un recordatorio sobre arreglos en Kotlin, por favor visita el primer tutorial en esta serie.)

Las colecciones de Kotlin nos dan la habilidad para lograr mucho con solo un poco de código---¡a diferencia de Java, que parece necesitar mucho código para lograr un poco! Kotlin tiene dos variantes de colecciones: mutable e inmutable. Una colección mutable nos proporciona la habilidad de modificar una colección ya sea agregando, removiendo o reemplazando un elemento. Las colecciones inmutables no pueden ser modificadas y no tienen estos métodos de ayuda.

Nota que la adición, remoción o reemplazo de un elemento en una colección inmutable es posible vía funciones operador (llegaremos a eso pronto), pero estas terminarán creando una nueva colección.

La Interfaz Iterable

La interfaz Iterable Kotlin está encima de la clase de jerarquía de colecciones. Esta interfaz habilita a las colecciones para ser representadas como una secuencia de elementos (que pueden ser iteradas, naturalmente),

La Interfaz Collection

La interfaz Collection de Kotlin extiende a la interfaz Iterable. La interfaz Collection es inmutable. Las interfaces Set y List (más sobre estas pronto) en Kotlin extienden a esta interfaz.

Algunas de las funciones y propiedades disponibles en la interfaz Collection son:

  • size: esta propiedad devuelve el tamaño de la colección.
  • isEmpty(): devuelve verdadero si la colección está vacía o falso en caso contrario.
  • contains(element: E): devuelve verdadero si el elemento especificado en el argumento está presente en la colección.
  • containsAll(element: Collection<E>): devuelve verdadero si el elemento en la colección pasado como argumento está presente en la colección.

La Interfaz MutableIterable

Esta interfaz en Kotlin nos da un iterador mutable especializado de la interfaz padre Iterable.

La Interfaz MutableCollection

La interfaz MutableCollection en Kotlin es una interfaz especializada que habilita a las colecciones para ser mutables. En otras palabras, agregar o remover operaciones puede ser realizado en una colección dada. Esta interfaz extiende a la interfaz Collection y la interfaz MutableIterable que ya discutimos arriba. Las interfaces MutableSet y MutableList (llegaremos a ellas pronto) en Kotlin extiende a esta interfaz. Las funciones disponibles en esta interfaz---además de las que están disponibles en sus padres---son:

  • add(element: E): agrega el elemento pasado como un argumento a la colección y devuelve verdadero si es exitoso o falso si la colección no soporta duplicados y los elementos ya están presentes.
  • remove(element: E): remueve el elemento pasado como un argumento de la colección. Devuelve verdadero si es exitoso o falso si no estaba presente en la colección.
  • addAll(elements: Collection<E>): agrega todos los elementos en la colección pasados como argumentos a la colección. Devuelve verdadero si es exitoso o falso si nada se agregó.
  • removeAll(elements: Collection<E>): remueve todos los elementos presentes en la colección pasados como argumentos. Devuelve verdadero si es exitoso o falso si nada es removido.
  • retainAll(elements: Collection<E>): retiene solo los elementos presentes en las colecciones pasadas como argumentos. Devuelve verdadero si es exitoso o falso si nada fue retenido.
  • clear(): remueve todos los elementos de esta colección.

Ahora has aprendido sobre las principales interfaces en la clase de jerarquía de colección en Kotlin, echemos ahora un vistazo a cómo maneja Kotlin colecciones tales como Listas, Conjuntos y Mapas en la parte restante de este tutorial.

Listas

Una lista es una colección ordenada de elementos. Esta es una colección popular que es ampliamente usada. Veamos diferentes maneras de crear una lista en Kotlin.

Usando la Función listOf()

En Kotlin, podemos crear una lista inmutable (solo lectura) usando la función de ayuda listOf() desde la librería estándar Kotlin. Esta función devuelve un tipo de interfaz Kotlin List.

Ejecutar el código de arriba imprimirá:

Además, podemos pasar valores en diferentes tipos al listOf() como argumentos y el resultado aún funcionará---será una lista de tipo mixto.

Usando la Función emptyList()

Esta función solo crea una lista inmutable y devuelve una interfaz tipo Kotlin List.

Usando la Función listOfNotNull()

Esta función crea una nueva lista inmutable conteniendo solo elementos que no son nulos. Nota que esta función devuelve una interfaz tipo Kotlin List también.

La interfaz List de la librería estándar Kotlin extiende solo la interfaz Collection. En otra palabras, su único padre es la interfaz Collection. Esta anula todas las funciones en la interfaz padre para abastecer sus necesidades especiales y también define sus propias funciones, tales como:

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

Usando la Función arrayListOf()

Esto crea una lista mutable y devuelve un tipo Java ArrayList.

Usando la Función mutableListOf()

Para agregar, remover o reemplazar valores en una lista, necesitamos hacer a la lista mutable. Podemos convertir una lista inmutable a una mutable llamando a la función toMutableList() en la lista. Sin embargo, nota que este método creará una nueva lista.

Para crear una lista mutable de un cierto tipo desde cero, ej. String, usamos mutableListOf<String>(), mientras que para tipos mixtos podemos solo usar la función mutableListOf() en su lugar.

Cualquiera de estas funciones devolverá una interfaz tipo Kotlin MutableList. Esta interfaz extiende las interfaces MutableCollection y List discutidas anteriormente 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 a un elemento en la lista con otro elemento. Esto devuelve el elemento previamente en la posición especificada.
  • add(index: Int, element: E): inserta un elemento en el índice especificado.
  • removeAt(index: Int): se deshace del elemento en un índice particular.

Ejecutando el código de arriba, producimos el siguiente resultado:

Nota que todas estas funciones crear un ArrayList Java tras bambalinas.

Conjuntos

Un conjunto es una colección sin orden de elementos únicos. En otras palabras, ¡no puede tener ningún duplicado! Veamos algunas de las diferentes maneras de crear un conjunto en Kotlin. Cada una de estas crea una estructura diferente de datos, de las cuáles cada una está optimizada para un cierto tipo de tarea.

Usando la Función setOf()

Para crear un conjunto inmutable (solo lectura) en Kotlin, podemos usar la función setOf(), la cuál devuelve una interfaz tipo Kotlin Set.

Nota que la interfaz Kotlin Set extiende solo a la interfaz Kotlin Collection y anula todas las propiedades disponibles en su padre.

Usando la Función hashSetOf()

Usar la función hashSetOf() crea una colección Java HashSet que almacena elementos en una tabla hash. Debido a que esta función devuelve un tipo Java HashSet, podemos agregar, remover, o despejar elementos en el conjunto. En otras palabras, es mutable.

Usando la Función sortedSetOf()

Usar la función sortedSetOf() crea una colección Java TreeSet tras bambalinas, la cuál ordena elementos basado en su ordenamiento natural o por un comparador. Este conjunto también es mutable.

Usando la Función linkedSetOf()

Esta función devuelve un tipo Java LinkedHashSet. Este conjunto mutable mantiene una lista enlazada de entradas en el conjunto, en el orden en el cuál fueron insertadas.

Usando la Función mutableSetOf()

Podemos usar mutableSetOf() para crear un conjunto mutable. Esta función devuelve una interfaz tipo Kotlin MutableSet. Tras bambalinas, esta función simplemente crea un LinkedHashSet Java.

La interfaz MutableSet extiende a las interfaces MutableCollection y Set.

Mapas

Los mapas asocian claves con valores. Las claves deben ser únicas, pero los valores asociados no. De eso 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. Detrás de escenas, Kotlin usa la colección Java Map para implementar su tipo de colección de mapa.

Usando la Función mapOf()

Para crear una colección Map inmutable o de solo lectura en Kotlin, usamos la función mapOf(). Creamos un mapa con esta función dándole una lista de pares---el primer valor es la clave, y el segundo es el valor. Llamar a esta función devuelve una interfaz tipo Kotlin Map.

Ejecutar el código de arriba producirá el resultado:

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 son:

  • tamaño: esta propiedad devuelve el tamaño de colección mapa.
  • isEmpty(): devuelve verdadero si el mapa está vacío o falso de otro modo.
  • containsKey(key: K): devuelve verdadero si el mapa contiene la clave en el argumento.
  • containsValue(value: V): devuelve verdadero si el mapa mapea una o más claves al valor pasado como un argumento.
  • get(key: K): devuelve el valor empatando la llave dada o 'null' si no se encuentra ninguno.
  • keys: esta propiedad devuelve un Set inmutable de todas las claves en el mapa.
  • values: devuelve una Collection inmutable de todos los valores en el mapa.

Usando la Función mutableMapOf()

La función mutableMapOf() crea un mapa mutable por nosotros de manera que podamos agregar y remover elementos en el mapa. Esto devuelve una interfaz tipo Kotlin MutableMap.

La interfaz MutableMap no extiende la interfaz MutableCollection; su único padre es la interfaz Map. Este anula las propiedades keys, entries y values desde la interfaz padre para poder redefinirlas. Aquí hay algunas funciones extra disponibles en la interfaz MutableMap:

  • put(key: K, value: V): inserta el par de valores de clave en el mapa. Esto devolverá el valor previo enlazado con la clave o null si la clave no fue usada anteriormente.
  • remove(key: K): remueve la clave y su valor enlazado desde el mapa.
  • putAll (from: Map<out K, V>): actualiza el mapa con todos los datos desde el mapa dado. Nuevas claves serán agregadas, y claves existentes serán actualizadas con nuevos valores.
  • clear(): remueve todos los elementos del mapa.

Podemos obtener el valor de una clave usando la función get(). También podemos usar notación de llave cuadrada como un atajo para get().

Usando la Función hashMapOf()

Usar esta función devuelve un tipo Java HashMap que es mutable. La clase HashMap usa una tabla hash para implementar la interfaz Java Map.

Usando la Función linkedHashMap()

Esta función devuelve un tipo Java LinkedHashMap que es mutable. La clase LinkedHashMap extiende a Java HashMap y mantiene una lista enlazada de entradas en el mapa para en el orden en el cuál fueron insertadas.

Usando la Función sortedMapOf()

Esta función devuelve un tipo Java SortedMap el cuál es mutable. La clase Java SortedMap ve que todas las entradas en el mapa sean mantenidas en un orden de clave ascendente.

Recuerda, la implementación de estas interfaces de colección en Kotlin suceden en tiempo de compilación.

Funciones de Colecciones de Operación

Kotlin nos proporciona muchas funciones operador llamadas funciones de extensión que pueden ser invocadas sobre colecciones. Echemos un vistazo a algunas de las más útiles.

La Función last()

Esta función operador devuelve el último elemento en una colección tal como una lista o conjunto. También podemos proveer un predicado para buscar dentro de un subconjunto de elementos.

La Función first()

Esta función operador devuelve el primer elemento cuando se invoca sobre una colección tal como una lista o conjunto. Si un predicado es dado, entonces usa el predicado para restringir la operación a un subconjunto de elementos.

La Función max()

Invocar esta función operador sobre una colección tal como una lista o conjunto devuelve el elemento más grande, o nulo si no se encuentra un elemento más grande.

La Función drop()

Llamar a esta función operador devuelve una nueva lista o conjunto conteniendo todos los elementos excepto los primeros n elementos.

La Función plus()

Esta función operador devuelve una colección conteniendo todos los elementos del original y después el elemento dado si no está ya en la colección. Esto terminará creando una nueva lista en vez de modificar la lista.

La Función minus()

El opuesto de la función plus() es la función minus(). Esta devuelve una colección conteniendo todos los elementos del conjunto original excepto el elemento dado. Esto termina creando una nueva lista en vez de alterar la lista.

La Función average()

Llamar esta función operador devolverá un número promedio de elementos en la colección.

La mayoría de estas funciones de extensión están disponibles en la librería estándar de colecciones Kotlin. Se te recomienda revisar la documentación para aprender sobre las otras.

Conclusión

En este tutorial, aprendiste sobre la API de rango y colecciones en el lenguaje de programación Kotlin. En el siguiente tutorial en la serie Kotlin Desde Cero, se te presentarán funciones en Kotlin. ¡Te veo pronto!

Para aprender más sobre el lenguaje Kotlin, recomiendo visitar la documentación Kotlin. ¡O revisa algunos de nuestros artículos de desarrollo de apps Android aquí en Envato Tuts+!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.