Kotlin desde cero gamas y colecciones

Kotlin es un lenguaje de programación moderno que compila a bytecode Java. Es gratuito y de código abierto, y promete hacer que la codificación para Android sea aún más divertida.

En el artículo anterior de esta serie, aprendió sobre la nulabilidad, los bucles y las condiciones en Kotlin. En este tutorial, continuaremos aprendiendo el idioma al observar los 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 inicial y uno final. Los rangos en Kotlin están cerrados, lo que significa que el valor de inicio y el valor final están incluidos en el rango. 

Ahora veremos las diferentes formas de crear rangos en Kotlin..

los ...  Operador

val oneToFive = 1… 5

En el código anterior, hemos creado un rango cerrado. Esta variable oneToFive incluirá los siguientes valores: 1, 2, 3, 4, 5. Podemos recorrerlo usando el para construcción de bucle.

para (n en oneToFive) imprimir (n)

El código anterior se puede acortar a:

para (n en 1… 5) imprimir (n)

También podemos crear una gama de personajes:

val aToZ = "a" ... "z"

La variable de la A a la Z Tendrá todas las letras en el alfabeto inglés..

los rangeTo () Función

los ... operador puede ser reemplazado con el rangeTo () Función de extensión para crear un rango. Por ejemplo, también podemos hacer esto. 1.rangeTo (5) y todavía tendría los mismos resultados que usando el ...  operador como se discutió anteriormente. 

val oneToFive: IntRange = 1.rangeTo (5)

los Abajo a() Función

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

val fiveToOne = 5.downTo (1)

Podemos modificar el rango utilizando el paso() función. Esto modificará el delta entre cada elemento en el rango..

val oneToTenStep = 1… 10 paso 2 // 1, 3, 5, 7, 9

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

los en Operador

los en el operador se utiliza para determinar si un valor está presente en un rango dado.

if (5 en 1… 10) imprimir ("Sí 5 está en el rango") // imprime "Sí 5 está en el rango"

En el código anterior, verificamos si 5 está en el rango 1 ... 10 usando el en operador. También podemos hacer lo contrario usando !norte para comprobar si 5 no está en el rango.

2. Colecciones

Las colecciones se utilizan para almacenar grupos de objetos relacionados en la memoria. En una colección, podemos recuperar, almacenar u organizar los objetos. Kotlin proporciona su API de colecciones como una biblioteca estándar construida sobre la API de colecciones de Java. (Discutiremos las interfaces en Kotlin en una publicación futura). 

Debe tener en cuenta que estas interfaces están vinculadas a su implementación en tiempo de compilación. No puede ver el código fuente de la implementación en Kotlin, porque las colecciones son implementadas por las Colecciones Java estándar, como Lista de arregloMapasHashMapConjuntosHashSetLista y así. Para comprender realmente la API de colecciones en Kotlin, deberá familiarizarse con estas clases e interfaces básicas en Java.

En esta sección, aprenderemos sobre el Lista, Conjunto y Mapa Colecciones en Kotlin. (Si desea un repaso de arrays en Kotlin, visite el primer tutorial de esta serie.) 

Las colecciones de Kotlin nos dan la capacidad de 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: mutables e inmutables. Una colección mutable nos brinda la capacidad de modificar una colección ya sea agregando, eliminando o reemplazando un elemento. Las colecciones inmutables no se pueden modificar y no tienen estos métodos de ayuda.. 

Tenga en cuenta que la adición, eliminación o reemplazo de un elemento en una colección inmutable es posible a través de las funciones del operador (llegaremos a eso en breve), pero estas terminarán creando una nueva colección..

los Iterable Interfaz

El kotlin Iterable La interfaz está en la parte superior de la jerarquía de clases de colecciones. Esta interfaz permite que las colecciones se representen como una secuencia de elementos (que se pueden iterar, naturalmente). 

interfaz pública iterable iterador divertido del operador abstracto público (): iterador 

los Colección Interfaz

El kotlin Colección interfaz extiende el Iterable interfaz. los Colección La interfaz es inmutable. En otras palabras, tiene acceso de solo lectura a las colecciones. los ConjuntoLista Las interfaces (más sobre esto en breve) en Kotlin extienden esta interfaz. 

Algunas de las funciones y propiedades disponibles en el Colección interfaz son:

  • tamaño: esta propiedad devuelve el tamaño de la colección.
  • esta vacio(): devuelve true si la colección está vacía o false de lo contrario. 
  • contiene (elemento: E): devuelve true si el elemento especificado en el argumento está presente en la colección.
  • contiene todo (elemento: colección): devuelve true si el elemento en la colección pasado como argumento está presente en la colección.  
Colección de interfaz pública : Iterable tamaño de valor público: Int público fun isEmpty (): contiene un operador público booleano fun (elemento: @UnsafeVariance E): iterador fun (boolean override fun) (iterador) diversión pública contiene todos (elementos: colección<@UnsafeVariance E>): Booleano

los MutableIterable Interfaz

Esta interfaz en Kotlin nos da un iterador mutable especializado desde el padre Iterable interfaz.

interfaz pública MutableIterable : Iterable anular fun iterator (): MutableIterator 

los Recolección mutable Interfaz

los Recolección mutable La interfaz en Kotlin es una interfaz especializada que permite que las colecciones sean mutables. En otras palabras, las operaciones de agregar y eliminar se pueden realizar en una colección determinada. Esta interfaz extiende tanto la Colección interfaz y la MutableIterable interfaz ya discutida anteriormente. los MutableSetLista mutable Las interfaces (llegaremos a ellas en breve) en Kotlin extienden esta interfaz. Las funciones disponibles en esta interfaz, aparte de las disponibles en sus padres, son:

  • añadir (elemento: 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 admite duplicados y el elemento ya está presente.
  • eliminar (elemento: E): elimina el elemento pasado como un argumento de la colección. Devuelve verdadero si fue exitoso o falso si no estaba presente en la colección.
  • addAll (elementos: Colección): agrega todos los elementos de la colección pasados ​​como argumentos a la colección. Devuelve verdadero si fue exitoso o falso si no se agregó nada.
  • removeAll (elementos: Colección): elimina todos los elementos presentes en la colección pasados ​​como argumentos. Devuelve verdadero si fue exitoso o falso si no se eliminó nada.
  • retener todos (elementos: colección): conserva solo los elementos presentes en las colecciones pasadas como argumentos. Devuelve verdadero si fue exitoso o falso si no se retuvo nada. 
  • claro(): elimina todos los elementos de esta colección.
interfaz pública MutableCollection : Colección, MutableIterable anular fun iterator (): MutableIterator public fun add (elemento: E): Boolean public fun remove (element: E): Boolean public fun addAll (elements: Collection): Boolean public fun removeAll (elements: Collection): Diversión pública booleana retener todos (elementos: Colección): Boolean public fun clear (): Unit

Ahora que ha aprendido acerca de las principales interfaces en la jerarquía de clases de colección en Kotlin, ahora veamos cómo Kotlin maneja colecciones como listas, conjuntos y mapas en la parte restante del tutorial..

Liza

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

Utilizando la lista de() Función

En Kotlin, podemos crear una lista inmutable (solo lectura) usando el lista de() Función auxiliar de la biblioteca estándar de Kotlin. Esta función devuelve un Kotlin. Lista Tipo de interfaz.

Números var: Lista = listOf (1, 2, 3, 4, 5) var names: List = listOf ("Chike", "Nnamdi", "Mgbemena") para (nombre en nombres) println (nombre)

Ejecutando el código de arriba se imprimirá: 

Chike Nnamdi Mgbemena

Además, podemos pasar valores de diferentes tipos a la lista de() como argumentos y el resultado seguirá funcionando, será una lista de tipos mixtos. 

var listMixedTypes = listOf ("Chike", 1, 2.445, 's') // todavía se compilará 

Utilizando la lista vacía() Función

Esta función simplemente crea una lista inmutable vacía y devuelve un Kotlin Lista Tipo de interfaz.

val emptyList: Lista = emptyList() 

Utilizando la listOfNotNull () Función

Esta función crea una nueva lista inmutable que contiene solo elementos que no son nulos. Tenga en cuenta que esta función devuelve un Kotlin Lista tipo de interfaz también.

val nonNullsList: Lista = listOfNotNull (2, 45, 2, nulo, 5, nulo)

los Lista interfaz de la biblioteca estándar de Kotlin se extiende sólo la Colección interfaz. En otras palabras, su único padre es el Colección interfaz. Anula todas las funciones en la interfaz principal para satisfacer sus necesidades especiales y también define sus propias funciones, tales como:

  • obtener (índice: int): un operador de función que devuelve el elemento en el índice especificado. 
  • indexOf (elemento: E): devuelve el índice de la primera aparición del elemento pasado como un argumento en la lista, o -1 si no se encuentra ninguno.
  • lastIndexOf (elemento: E): devuelve el índice de la última aparición del elemento pasado como un argumento en la lista, o -1 si no se encuentra ninguno. 
  • listIterator (): devuelve un iterador de lista sobre los elementos de la lista.
  • subList (fromIndex: Int, toIndex: Int): devuelve una lista que contiene la parte de la lista entre los índices de inicio y fin especificados. 
println (names.size) // 3 println (names.get (0)) // "Chike" println (names.indexOf ("Mgbemena")) // 2 println (names.contains ("Nnamdi")) // 'cierto'

Utilizando la arrayListOf () Función

Esto crea una lista mutable y devuelve un Java Lista de arreglo tipo.

val stringList: ArrayList = arrayListOf("Hola allí") 

Utilizando la mutableListOf () Función

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

var mutableNames1 = names.toMutableList () mutableNames1.add ("Ruth") // ahora mutable y agregó "Ruth" a la lista

Para crear una lista mutable de un cierto tipo desde cero, por ejemplo. Cuerda, usamos mutableListOf(), mientras que para los tipos mixtos podemos usar el mutableListOf () función en su lugar.

// una lista mutable de un cierto tipo, por ejemplo, String val mutableListNames: MutableList = mutableListOf("Josh", "Kene", "Sanya") mutableListNames.add ("Mary") mutableListNames.removeAt (1) mutableListNames [0] = "Oluchi" // reemplaza el elemento en el índice 0 por "Oluchi" // a lista mutable de tipos mixtos val mutableListMixed = mutableListOf ("BMW", "Toyota", 1, 6.76, 'v')

Cualquiera de estas funciones devolverá un Lista mutable Tipo de interfaz Kotlin. Esta interfaz extiende tanto la Recolección mutable y Lista interfaces discutidas anteriormente en esta sección. los Lista mutable La interfaz agrega métodos para la recuperación o sustitución de un elemento según su posición: 

  • conjunto (índice: Int, elemento: E): sustituye un elemento en la lista con otro elemento. Esto devuelve el elemento previamente en la posición especificada..
  • agregar (índice: Int, elemento: E): inserta un elemento en el índice especificado. 
  • removeAt (index: Int): se deshace del elemento en un índice particular. 
val mutableListFood: MutableList = mutableListOf("Rice & stew", "Jollof rice", "Eba & Egusi", "Fried rice") mutableListFood.remove ("Fried rice") mutableListFood.removeAt (0) mutableListFood.set (0, "Beans") mutableListFood. agregue (1, "Bread & tea") para (foodName en mutableListFood) println (foodName)

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

Frijoles Pan & té Eba & Egusi

Tenga en cuenta que todas estas funciones crean un Java Lista de arreglo entre bastidores.

Conjuntos

Un conjunto es una colección desordenada de elementos únicos. En otras palabras, no puede tener duplicados! Veamos algunas de las diferentes formas de crear un set en Kotlin. Cada uno de estos crea una estructura de datos diferente, cada uno de los cuales está optimizado para un cierto tipo de tarea. 

Utilizando la setOf () Función

Para crear un conjunto inmutable (solo lectura) en Kotlin, podemos usar la función setOf (), que devuelve un Kotlin Conjunto Tipo de interfaz. 

// crea un conjunto inmutable de tipos mixtos val mixedTypesSet = setOf (2, 4.454, "how", "far", 'c') // compilará var intSet: Set = setOf (1, 3, 4) // solo se permiten tipos de enteros

Tenga en cuenta que el Kotlin Conjunto La interfaz solo extiende el Kotlin. Colección Interfaz y anula todas las propiedades disponibles en su padre.

Utilizando la hashSetOf () Función 

Utilizando la hashSetOf () la función crea un Java HashSet Colección que almacena elementos en una tabla hash. Porque esta función devuelve un Java HashSet Escriba, podemos agregar, eliminar o borrar elementos del conjunto. En otras palabras, es mutable.. 

val intsHashSet: java.util.HashSet = hashSetOf (1, 2, 6, 3) intsHashSet.add (5) intsHashSet.remove (1) 

Utilizando la sortedSetOf () Función

Utilizando la sortedSetOf () la función crea un Java TreeSet colección detrás de escena, que ordena elementos según su orden natural o por un comparador. Este conjunto también es mutable..

val intsSortedSet: java.util.TreeSet = sortedSetOf (4, 1, 7, 2) intsSortedSet.add (6) intsSortedSet.remove (1) intsSortedSet.clear ()

Utilizando la linkedSetOf () Función

Esta función devuelve un Java LinkedHashSet tipo. Este conjunto mutable mantiene una lista vinculada de las entradas en el conjunto, en el orden en que se insertaron.. 

val intsLinkedHashSet: java.util.LinkedHashSet = linkedSetOf (5, 2, 7, 2, 5) // 5, 2, 7 intsLinkedHashSet.add (4) intsLinkedHashSet.remove (2) intsLinkedHashSet.clear ()

Utilizando la mutableSetOf () Función

Nosotros podemos usar mutableSetOf () para crear un conjunto mutable. Esta función devuelve un Kotlin. MutableSet Tipo de interfaz. Detrás de escena, esta función simplemente crea un Java. LinkedHashSet.  

// crea un conjunto mutable de tipos int solo val intsMutableSet: MutableSet = mutableSetOf (3, 5, 6, 2, 0) intsMutableSet.add (8) intsMutableSet.remove (3)

los MutableSet interfaz se extiende tanto la Recolección mutable y el Conjunto interfaces. 

Mapas

Los mapas asocian claves a valores. Las claves deben ser únicas, pero los valores asociados no necesitan serlo. De esa manera, cada clave se puede usar para identificar de forma única el valor asociado, ya que el mapa se asegura de que no pueda haber claves duplicadas en la colección. Detrás de escena, Kotlin usa el Java. Mapa colección para implementar su tipo de colección de mapas.

Utilizando la mapa de() Función

Para crear un inmutable o solo lectura. Mapa colección en Kotlin, utilizamos la mapa de() función. 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. Llamando a esta función devuelve un Kotlin. Mapa Tipo de interfaz.

val callingCodesMap: Mapa = mapOf (234 a "Nigeria", 1 a "USA", 233 a "Ghana") para ((clave, valor) en callingCodesMap) println ("$ key es el código de llamada para $ value") print (callingCodesMap [234]) // Nigeria

Ejecutar el código anterior producirá el resultado: 

234 es el código de llamada para Nigeria 1 es el código de llamada para EE.UU. 233 es el código de llamada para Ghana

A diferencia del Lista y Conjunto interfaces en Kotlin que extienden el Colección interfaz, la Mapa La interfaz no se extiende en absoluto. Algunas de las propiedades y funciones disponibles en esta interfaz son:

  • tamaño: esta propiedad devuelve el tamaño de la colección de mapas.
  • esta vacio(): devuelve true si el mapa está vacío o false de lo contrario.
  • contiene la clave (clave: K): devuelve true si el mapa contiene la clave en el argumento. 
  • contieneValor (valor: V): devuelve true si el mapa asigna una o más claves al valor pasado como argumento.
  • obtener (clave: K): devuelve el valor que coincide con la clave dada o 'nulo' si no se encuentra ninguno. 
  • llaves: esta propiedad devuelve un inmutable Conjunto De todas las claves en el mapa..
  • valores: devuelve un inmutable Colección De todos los valores en el mapa..

Utilizando la mutableMapOf () Función

los mutableMapOf () La función crea un mapa mutable para nosotros para que podamos agregar y eliminar elementos en el mapa. Esto devuelve un Kotlin Mapa mutable Tipo de interfaz.

monedas de cambioMutableMap: MutableMap = mutableMapOf ("Naira" a "Nigeria", "Dollars" a "USA", "Pounds" a "UK") println ("Los países son $ currenciesMutableMap.values") // Los países son [Nigeria, USA, UK ] println ("Las monedas son $ currenciesMutableMap.keys") // Las monedas son [Naira, Dollars, Pounds] currenciesMutableMap.put ("Cedi", "Ghana") currenciesMutableMap.remove ("Dollars")

los Mapa mutable la interfaz no extiende la Recolección mutable interfaz; es solo el padre es el Mapa interfaz. Anula el llavesentradas y valores Propiedades de la interfaz padre para redefinirlas. Estas son algunas de las funciones adicionales disponibles en el Mapa mutable interfaz:

  • poner (clave: K, valor: V): inserta la clave, el par de valores en el mapa. Esto devolverá el valor anterior vinculado con la clave o nulo si la clave no se usó anteriormente. 
  • eliminar (clave: K): elimina la clave y su valor vinculado del mapa. 
  • poner todo(desde: Mapa): actualiza el mapa con todos los datos del mapa dado. Se agregarán nuevas claves, y las claves existentes se actualizarán con nuevos valores. 
  • claro(): elimina todos los elementos del mapa. 

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

print (currenciesMutableMap.get ("Nigeria")) // imprimirá Naira print (currenciesMutableMap ["Nigeria"]) // imprimirá Naira

Utilizando la hashMapOf () Función

Usando esta función devuelve un Java HashMap Tipo que es mutable. los HashMap clase utiliza una tabla hash para implementar el Java Mapa interfaz.  

val personsHashMap: java.util.HashMap = hashMapOf (1 a "Chike", 2 a "John", 3 a "Emeka") personasHashMap.put (4, "Chuka") personasHashMap.remove (2) print (personsHashMap [1]) // imprimirá Chike

Utilizando la linkedHashMap () Función

Esta función devuelve un Java LinkedHashMap Tipo que es mutable. los LinkedHashMap clase extiende Java HashMap y mantiene una lista enlazada de las entradas en el mapa en el orden en que se insertaron. 

val postalCodesHashMap: java.util.LinkedHashMap = linkedMapOf ("NG" a "Nigeria", "AU" a "Australia", "CA" a "Canada") postalCodesHashMap.put ("NA", "Namibia") postalCodesHashMap.remove ("AU") postalCodesHashMap.get ("CA") // Canadá

Utilizando la sortedMapOf () Función

Esta función devuelve un Java SortedMap Tipo que es mutable. El java SortedMap La clase ve que las entradas en el mapa se mantienen en orden ascendente de claves..

val personsSortedMap: java.util.SortedMap = sortedMapOf (2 a "Chike", 1 a "John", 3 a "Emeka") personsSortedMap.put (7, "Adam") personsSortedMap.remove (3)

Recuerde, la implementación de estas interfaces de colección en Kotlin ocurre en tiempo de compilación.

Funciones de operación de colecciones

Kotlin nos proporciona muchas funciones de operador útiles llamadas funciones de extensión que se pueden invocar en colecciones. Echemos un vistazo a algunos de los más útiles..

los último() Función

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

val stringList: lista = listOf ("in", "the", "club") print (stringList.last ()) // imprimirá "club" // dada una impresión de predicado (stringList.last it.length == 3) / / imprimirá "the" val intSet: Set = setOf (3, 5, 6, 6, 6, 3) print (intSet.last ()) // imprimirá 6

los primero() Función

Esta función de operador devuelve el primer elemento cuando se invoca en una colección, como una lista o un conjunto. Si se da un predicado, entonces lo utiliza para restringir la operación a un subconjunto de elementos.

print (stringList.first ()) // imprimirá "in" print (intSet.first ()) // imprimirá 3

los max () Función

Al invocar esta función de operador en una colección como una lista o conjunto, se devuelve el elemento más grande, o nulo si no se encuentra el elemento más grande.

val intList: Lista = listOf (1, 3, 4) print (intList.max ()) // imprimirá 4 print (intSet.max ()) // imprimirá 6 

los soltar() Función

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

print (stringList.drop (2)) // imprimirá "club"

los más() Función

Esta función de operador devuelve una colección que contiene todos los elementos del original y luego el elemento dado si aún no está en la colección. Esto terminará creando una nueva lista en lugar de modificarla..

print (intList.plus (6)) // imprimirá [1, 3, 4, 6]

los menos() Función

Lo contrario de la más() la función es la menos() función. Devuelve una colección que contiene todos los elementos del conjunto original, excepto el elemento dado. Esto también termina creando una nueva lista en lugar de alterarla..

print (intList.minus (3)) // imprimirá [1, 4]

los promedio() Función

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

print (intList.average ()) // imprimirá 2.666666666666666665

La mayoría de estas funciones de extensión están disponibles en la biblioteca estándar de colecciones de Kotlin. Se recomienda consultar la documentación para conocer a los demás..

Conclusión

En este tutorial, aprendió sobre el rango y la API de colecciones en el lenguaje de programación Kotlin. En el siguiente tutorial de la serie Kotlin From Scratch, se le presentarán las funciones de Kotlin. Te veo pronto!

Para obtener más información sobre el idioma Kotlin, recomiendo visitar la documentación de Kotlin. O echa un vistazo a algunas de nuestras otras publicaciones de desarrollo de aplicaciones para Android aquí en Envato Tuts!