Kotlin From Scratch Ranges and Collections

Kotlin è un linguaggio di programmazione moderno che viene compilato in bytecode Java. È gratuito e open source e promette di rendere la codifica per Android ancora più divertente.

Nell'articolo precedente di questa serie, hai imparato a conoscere nulla, loop e condizioni in Kotlin. In questo tutorial, continueremo a imparare la lingua osservando le API di intervalli e raccolte in Kotlin.

1. Gamme

Un intervallo in Kotlin è un tipo univoco che definisce un valore iniziale e un valore finale. In altre parole, è un intervallo tra un valore iniziale e un valore finale. Gli intervalli in Kotlin sono chiusi, il che significa che il valore iniziale e il valore finale sono inclusi nell'intervallo. 

Vedremo ora i diversi modi di creare intervalli in Kotlin.

Il ...  Operatore

val oneToFive = 1 ... 5

Nel codice sopra, abbiamo creato un intervallo chiuso. Questa variabile oneToFive includerà i seguenti valori: 1, 2, 3, 4, 5. Possiamo passarci sopra usando il tasto per costruisci il ciclo.

for (n in oneToFive) print (n)

Il codice sopra può essere abbreviato in:

for (n in 1 ... 5) print (n)

Possiamo anche creare una serie di caratteri:

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

La variabile dalla A alla Z avrà tutte le lettere dell'alfabeto inglese.

Il RangeTo () Funzione

Il ... l'operatore può essere sostituito con il RangeTo () funzione di estensione per creare un intervallo. Ad esempio, possiamo anche farlo 1.rangeTo (5) e avrebbe comunque gli stessi risultati dell'uso di ...  operatore come discusso in precedenza. 

val oneToFive: IntRange = 1.rangeTo (5)

Il giù verso() Funzione

Questa è un'altra funzione di estensione che creerà un intervallo a partire da un numero specificato fino a un altro.

val fiveToOne = 5.downTo (1)

Possiamo modificare la gamma usando il passo() funzione. Questo modificherà il delta tra ogni elemento nell'intervallo.

val oneToTenStep = 1 ... 10 step 2 // 1, 3, 5, 7, 9

Il codice sopra conterrà numeri dispari tra 1 e 10.

Il nel Operatore

Il nel l'operatore viene utilizzato per accertare se un valore è presente in un determinato intervallo.

if (5 in 1 ... 10) stampa ("Sì 5 è nell'intervallo") // stampa "Sì 5 è nell'intervallo"

Nel codice qui sopra, abbiamo verificato se 5 si trova nell'intervallo 1 ... 10 utilizzando il nel operatore. Possiamo anche fare il contrario usando !n per verificare se 5 non è nel range.

2. Collezioni

Le raccolte vengono utilizzate per memorizzare gruppi di oggetti correlati nella memoria. In una raccolta, possiamo recuperare, archiviare o organizzare gli oggetti. Kotlin fornisce le API delle raccolte come una libreria standard basata sull'API delle raccolte Java. (Discuteremo le interfacce in Kotlin in un post futuro.) 

Si noti che queste interfacce sono collegate alla loro implementazione in fase di compilazione. Non puoi vedere il codice sorgente dell'implementazione in Kotlin, perché le collezioni sono effettivamente implementate dalle Collezioni Java standard come Lista di arrayMappeHashMapImpostaHashSetElenco e così via. Per capire veramente l'API delle collezioni in Kotlin, è necessario avere familiarità con queste classi e interfacce di base in Java.

In questa sezione, impareremo a conoscere il Elenco, Impostato e Carta geografica collezioni in Kotlin. (Se vuoi un aggiornamento sugli array di Kotlin, visita il primo tutorial di questa serie.) 

Le collezioni di Kotlin ci danno la possibilità di ottenere molto con un piccolo codice, a differenza di Java, che sembra aver bisogno di molto codice per ottenere un po '! Kotlin ha due varianti di collezioni: mutevoli e immutabili. Una collezione mutevole ci fornisce la possibilità di modificare una collezione aggiungendo, rimuovendo o sostituendo un elemento. Le raccolte immutabili non possono essere modificate e non hanno questi metodi di supporto. 

Si noti che l'aggiunta, la rimozione o la sostituzione di un elemento in una collezione immutabile è possibile tramite le funzioni dell'operatore (ci arriveremo a breve), ma questi finiranno per creare una nuova collezione.

Il iterable Interfaccia

Il Kotlin iterable l'interfaccia è in cima alla gerarchia delle classi di collezioni. Questa interfaccia consente alle collezioni di essere rappresentate come una sequenza di elementi (che possono essere ripetuti, naturalmente). 

interfaccia pubblica Iterable public abstract operator fun iterator (): Iterator 

Il Collezione Interfaccia

Il Kotlin Collezione l'interfaccia estende il iterable interfaccia. Il Collezione l'interfaccia è immutabile. In altre parole, hai accesso in sola lettura alle raccolte. Il ImpostatoElenco le interfacce (più su queste a breve) in Kotlin estendono questa interfaccia. 

Alcune delle funzioni e proprietà disponibili in Collezione interfaccia sono:

  • taglia: questa proprietà restituisce la dimensione della raccolta.
  • è vuoto(): restituisce true se la raccolta è vuota o falsa altrimenti. 
  • contiene (elemento: E): restituisce true se l'elemento specificato nell'argomento è presente nella raccolta.
  • containsAll (elemento: Collection): restituisce true se l'elemento nella raccolta passato come argomento è presente nella raccolta.  
Collezione di interfaccia pubblica : Iterable public val size: Int public fun isEmpty (): Il divertimento dell'operatore pubblico booleano contiene (elemento: @UnsafeVariance E): override booleano fun iterator (): Iterator divertimento pubblico contiene Tutti (elementi: Collezione<@UnsafeVariance E>): Boolean

Il MutableIterable Interfaccia

Questa interfaccia in Kotlin ci fornisce un iteratore mutabile specializzato dal genitore iterable interfaccia.

interfaccia pubblica MutableIterable : Iterable override fun iterator (): MutableIterator 

Il MutableCollection Interfaccia

Il MutableCollection l'interfaccia in Kotlin è un'interfaccia specializzata che consente alle collezioni di essere modificabili. In altre parole, le operazioni di aggiunta e rimozione possono essere eseguite su una determinata raccolta. Questa interfaccia estende sia il Collezione interfaccia e il MutableIterable interfaccia già discussa sopra. Il MutableSetMutableList interfacce (ci arriveremo tra poco) in Kotlin estendono questa interfaccia. Le funzioni disponibili in questa interfaccia, a parte quelle disponibili nei suoi genitori, sono:

  • aggiungi (elemento: E): aggiunge l'elemento passato come argomento alla raccolta e restituisce true se ha successo o false se la raccolta non supporta i duplicati e l'elemento è già presente.
  • rimuovere (elemento: E): rimuove l'elemento passato come argomento dalla raccolta. Restituisce true se ha successo o false se non era presente nella collezione.
  • addAll (elements: Collection): aggiunge tutti gli elementi della raccolta passati come argomenti alla raccolta. Restituisce true se ha successo o false se non è stato aggiunto nulla.
  • removeAll (elements: Collection): rimuove tutti gli elementi presenti nella raccolta passati come argomenti. Restituisce true se ha successo o false se nulla è stato rimosso.
  • retainAll (elementi: Collezione): conserva solo gli elementi presenti nelle raccolte passate come argomenti. Restituisce true se ha successo o false se non è stato mantenuto nulla. 
  • chiaro(): rimuove tutti gli elementi da questa raccolta.
interfaccia pubblica MutableCollection : Collezione, MutableIterable override fun iterator (): MutableIterator public fun add (elemento: E): Boolean public fun remove (elemento: E): Boolean public fun addAll (elements: Collection): Boolean public fun removeAll (elements: Collection): Divertimento pubblico booleano retainAll (elementi: Collezione): Boolean public fun clear (): Unit

Ora hai imparato a conoscere le principali interfacce nella gerarchia delle classi di raccolta in Kotlin, vediamo ora come Kotlin gestisce raccolte come Liste, Set e Mappe nella parte restante del tutorial.

elenchi

Una lista è una raccolta ordinata di elementi. Questa è una collezione popolare che è ampiamente utilizzata. Diamo un'occhiata a diversi modi di creare un elenco in Kotlin.

Usando il lista di() Funzione

In Kotlin, possiamo creare una lista (sola lettura) immutabile usando il lista di() funzione di supporto dalla libreria standard di Kotlin. Questa funzione restituisce un Kotlin Elenco tipo di interfaccia.

numeri var: elenco = listOf (1, 2, 3, 4, 5) nomi var: List = listOf ("Chike", "Nnamdi", "Mgbemena") per (nome nei nomi) println (nome)

Eseguendo il codice sopra verrà stampato: 

Chike Nnamdi Mgbemena

Inoltre, possiamo passare valori di diversi tipi nel lista di() come argomenti e il risultato funzionerà ancora: sarà una lista di tipi misti. 

var listMixedTypes = listOf ("Chike", 1, 2.445, 's') // sarà ancora compilato 

Usando il emptyList () Funzione

Questa funzione crea solo una lista immutabile vuota e restituisce un Kotlin Elenco tipo di interfaccia.

val emptyList: List = lista vuota() 

Usando il listOfNotNull () Funzione

Questa funzione crea una nuova lista immutabile contenente solo elementi che non sono nulli. Si noti che questa funzione restituisce un Kotlin Elenco anche il tipo di interfaccia.

val nonNullsList: List = listOfNotNull (2, 45, 2, null, 5, null)

Il Elenco l'interfaccia dalla libreria standard di Kotlin estende solo il Collezione interfaccia. In altre parole, il suo unico genitore è il Collezione interfaccia. Sovrascrive tutte le funzioni nell'interfaccia genitore per soddisfare le sue esigenze speciali e definisce anche le sue funzioni, come ad esempio:

  • get (indice: Int): un operatore di funzione che restituisce l'elemento nell'indice specificato. 
  • indexOf (elemento: E): restituisce l'indice della prima occorrenza dell'elemento passato come argomento nell'elenco, oppure -1 se non viene trovato nessuno.
  • lastIndexOf (elemento: E): restituisce l'indice dell'ultima occorrenza dell'elemento passato come argomento nell'elenco o -1 se non viene trovato nessuno. 
  • listIterator (): restituisce un elenco iteratore sugli elementi nell'elenco.
  • subList (fromIndex: Int, toIndex: Int): restituisce una lista che contiene la parte della lista tra gli indici di inizio e di fine specificati. 
println (names.size) // 3 println (names.get (0)) // "Chike" println (names.indexOf ("Mgbemena")) // 2 println (names.contains ("Nnamdi")) // 'vero'

Usando il arrayListOf () Funzione

Questo crea un elenco mutabile e restituisce un Java Lista di array genere.

val stringList: ArrayList = arrayListOf("Ciao") 

Usando il mutableListOf () Funzione

Per aggiungere, rimuovere o sostituire i valori in un elenco, è necessario rendere l'elenco mutabile. Possiamo convertire una lista immutabile in una mutabile chiamando la funzione toMutableList () sulla lista. Tuttavia, si noti che questo metodo creerà un nuovo elenco.

var mutableNames1 = names.toMutableList () mutableNames1.add ("Ruth") // ora mutabile e aggiunto "Ruth" alla lista

Per creare un elenco mutabile di un certo tipo da zero, ad es. Stringa, noi usiamo mutableListOf(), mentre per i tipi misti possiamo semplicemente usare il mutableListOf () funzione invece.

// un elenco mutabile di un certo tipo, ad es. String val mutableListNames: MutableList = mutableListOf("Josh", "Kene", "Sanya") mutableListNames.add ("Mary") mutableListNames.removeAt (1) mutableListNames [0] = "Oluchi" // sostituisce l'elemento nell'indice 0 con "Oluchi" // a elenco mutabile di tipi misti val mutableListMixed = mutableListOf ("BMW", "Toyota", 1, 6.76, "v")

Qualsiasi di queste funzioni restituirà a MutableList Tipo di interfaccia Kotlin Questa interfaccia estende sia il MutableCollection e Elenco interfacce discusse in precedenza in questa sezione. Il MutableList l'interfaccia aggiunge metodi per il recupero o la sostituzione di un articolo in base alla sua posizione: 

  • set (indice: Int, elemento: E): sostituisce un elemento nella lista con un altro elemento. Ciò restituisce l'elemento precedentemente nella posizione specificata.
  • aggiungi (indice: Int, elemento: E): inserisce un elemento nell'indice specificato. 
  • removeAt (index: Int): elimina l'elemento in un particolare indice. 
val mutableListFood: MutableList = mutableListOf("Riso e spezzatino", "Riso Jollof", "Eba & Egusi", "Riso fritto") mutableListFood.remove ("Riso fritto") mutableListFood.removeAt (0) mutableListFood.set (0, "Beans") mutableListFood. aggiungi (1, "Pane e tè") per (foodName in mutableListFood) println (foodName)

Eseguendo il codice sopra, produciamo il seguente risultato:

Fagioli Pane e tè Eba & Egusi

Nota che tutte queste funzioni creano un Java Lista di array dietro le quinte.

Imposta

Un set è una collezione non ordinata di elementi unici. In altre parole, non può avere duplicati! Diamo un'occhiata ad alcuni dei diversi modi di creare un set in Kotlin. Ognuno di questi crea una diversa struttura di dati, ognuno dei quali è ottimizzato per un certo tipo di attività. 

Usando il setof () Funzione

Per creare un set immutabile (di sola lettura) in Kotlin, possiamo usare la funzione setof (), che restituisce un Kotlin Impostato tipo di interfaccia. 

// crea un set immutabile di tipi misti val mixedTypesSet = setOf (2, 4.454, "how", "far", "c") // compila var intSet: Set = setOf (1, 3, 4) // solo i tipi di numeri consentiti

Si noti che il Kotlin Impostato l'interfaccia estende solo il Kotlin Collezione interfaccia e sovrascrive tutte le proprietà disponibili nel suo genitore.

Usando il hashSetOf () Funzione 

Usando il hashSetOf () la funzione crea un Java HashSet collezione che memorizza gli elementi in una tabella hash. Perché questa funzione restituisce un Java HashSet digita, possiamo aggiungere, rimuovere o cancellare elementi nel set. In altre parole, è mutabile. 

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

Usando il sortedSetOf () Funzione

Usando il sortedSetOf () la funzione crea un Java TreeSet collezione dietro le quinte, che ordina elementi in base al loro ordinamento naturale o da un comparatore. Questo set è anche mutabile.

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

Usando il linkedSetOf () Funzione

Questa funzione restituisce un Java LinkedHashSet genere. Questo set mutabile mantiene un elenco collegato delle voci nel set, nell'ordine in cui sono state inserite. 

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

Usando il mutableSetOf () Funzione

Possiamo usare mutableSetOf () per creare un set mutabile. Questa funzione restituisce un Kotlin MutableSet tipo di interfaccia. Dietro le quinte, questa funzione crea semplicemente un Java LinkedHashSet.  

// crea un insieme mutabile di tipi int solo val intsMutableSet: MutableSet = mutableSetOf (3, 5, 6, 2, 0) intsMutableSet.add (8) intsMutableSet.remove (3)

Il MutableSet interfaccia estende sia il MutableCollection e il Impostato interfacce. 

Mappe

Le mappe associano le chiavi ai valori. Le chiavi devono essere univoche, ma non è necessario che i valori associati siano. In questo modo, ciascuna chiave può essere utilizzata per identificare in modo univoco il valore associato, poiché la mappa si assicura che non sia possibile avere chiavi duplicate nella raccolta. Dietro le quinte, Kotlin usa Java Carta geografica collezione per implementare il suo tipo di raccolta di mappe.

Usando il mapof () Funzione

Per creare un valore immutabile o di sola lettura Carta geografica collezione in Kotlin, usiamo il mapof () funzione. Creiamo una mappa con questa funzione dandole una lista di coppie: il primo valore è la chiave, e il secondo è il valore. Chiamando questa funzione si restituisce un Kotlin Carta geografica tipo di interfaccia.

val callingCodesMap: Map = mapOf (da 234 a "Nigeria", da 1 a "USA", da 233 a "Ghana") per ((chiave, valore) in callingCodesMap) println ("$ key è il codice chiamante per $ valore") print (callingCodesMap [234]) // Nigeria

L'esecuzione del codice sopra produrrà il risultato: 

234 è il codice di chiamata per Nigeria 1 è il codice di chiamata per USA 233 è il codice chiamante per il Ghana

Non mi piace il Elenco e Impostato interfacce in Kotlin che estendono il Collezione interfaccia, la Carta geografica l'interfaccia non si estende affatto. Alcune delle proprietà e delle funzioni disponibili in questa interfaccia sono:

  • taglia: questa proprietà restituisce la dimensione della raccolta di mappe.
  • è vuoto(): restituisce true se la mappa è vuota o falsa altrimenti.
  • containsKey (chiave: K): restituisce true se la mappa contiene la chiave nell'argomento. 
  • containsValue (valore: V): restituisce true se la mappa mappa una o più chiavi del valore passato come argomento.
  • ottenere (chiave: K): restituisce il valore corrispondente alla chiave data o 'null' se non viene trovato alcun valore. 
  • chiavi: questa proprietà restituisce un immutabile Impostato di tutte le chiavi sulla mappa.
  • valori: restituisce un immutabile Collezione di tutti i valori nella mappa.

Usando il mutableMapOf () Funzione

Il mutableMapOf () la funzione crea una mappa mutevole per noi in modo che possiamo aggiungere e rimuovere elementi nella mappa. Questo restituisce un Kotlin MutableMap tipo di interfaccia.

val valuteMutableMap: MutableMap = mutableMapOf ("Naira" in "Nigeria", "Dollari" in "USA", "Pounds" in "UK") println ("I paesi sono $ valuteMutableMap.values") // I Paesi sono [Nigeria, USA, Regno Unito ] println ("Le valute sono $ valuteMutableMap.keys") // Le valute sono le valute [Naira, Dollari, Pounds ]MutableMap.put ("Cedi", "Ghana") valuteMutableMap.remove ("Dollari")

Il MutableMap l'interfaccia non estende il MutableCollection interfaccia; è solo genitore è il Carta geografica interfaccia. Sostituisce il chiaviinserimenti e valori proprietà dall'interfaccia genitore per ridefinirle. Ecco alcune delle funzioni extra disponibili in MutableMap interfaccia:

  • put (chiave: K, valore: V): inserisce la chiave, coppia di valori nella mappa. Ciò restituirà il valore precedente collegato alla chiave o null se la chiave non è stata precedentemente utilizzata. 
  • rimuovi (chiave: K): rimuove la chiave e il relativo valore collegato dalla mappa. 
  • metti tutto(da: mappa): aggiorna la mappa con tutti i dati della mappa specificata. Verranno aggiunte nuove chiavi e le chiavi esistenti verranno aggiornate con nuovi valori. 
  • chiaro(): rimuove tutti gli elementi dalla mappa. 

Possiamo ottenere il valore per una chiave usando il ottenere() funzione. Possiamo anche usare la notazione della parentesi quadra come scorciatoia per ottenere()

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

Usando il hashMapOf () Funzione

L'uso di questa funzione restituisce un Java HashMap digita che è mutabile. Il HashMap class usa una tabella hash per implementare Java Carta geografica interfaccia.  

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

Usando il LinkedHashMap () Funzione

Questa funzione restituisce un Java LinkedHashMap digita che è mutabile. Il LinkedHashMap la classe estende Java HashMap e mantiene un elenco collegato delle voci nella mappa nell'ordine in cui sono state inserite. 

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

Usando il sortedMapOf () Funzione

Questa funzione restituisce un Java SortedMap tipo che è mutabile. Il Java SortedMap class vede che le voci nella mappa sono mantenute in ordine crescente.

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

Ricorda, l'implementazione di queste interfacce di raccolta in Kotlin avviene in fase di compilazione.

Collezioni Funzionalità

Kotlin ci fornisce molte utili funzioni dell'operatore chiamate funzioni di estensione che possono essere richiamate in collezioni. Diamo un'occhiata ad alcuni dei più utili.

Il scorso() Funzione

Questa funzione operatore restituisce l'ultimo elemento in una raccolta come un elenco o un set. Possiamo anche fornire un predicato per cercare all'interno di un sottoinsieme di elementi.

val stringList: List = listOf ("in", "the", "club") print (stringList.last ()) // stamperà "club" // dato un print di predicato (stringList.last it.length == 3) / / stamperà "il" val intSet: Set = setOf (3, 5, 6, 6, 3) stampa (intSet.last ()) // stampa 6

Il primo() Funzione

Questa funzione operatore restituisce il primo elemento quando viene invocato su una raccolta come un elenco o un set. Se viene fornito un predicato, utilizza il predicato per limitare l'operazione a un sottoinsieme di elementi.

print (stringList.first ()) // stampa "in" print (intSet.first ()) // stampa 3

Il max () Funzione

Il richiamo di questa funzione dell'operatore su una raccolta come un elenco o un set restituisce l'elemento più grande, oppure null se non viene trovato alcun elemento più grande.

val intList: List = listOf (1, 3, 4) print (intList.max ()) // stampa 4 print (intSet.max ()) // stampa 6 

Il far cadere() Funzione

La chiamata a questa funzione operatore restituisce un nuovo elenco o un insieme contenente tutti gli elementi tranne i primi n elementi.

print (stringList.drop (2)) // stamperà "club"

Il più() Funzione

Questa funzione operatore restituisce una raccolta contenente tutti gli elementi dell'originale e quindi l'elemento dato se non è già presente nella raccolta. Questo finirà per creare una nuova lista invece di modificare la lista.

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

Il meno() Funzione

L'opposto di più() la funzione è il meno() funzione. Restituisce una raccolta contenente tutti gli elementi del set originale tranne l'elemento specificato. Questo finisce anche per creare una nuova lista invece di alterare la lista.

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

Il media() Funzione

La chiamata a questa funzione operatore restituirà un numero medio di elementi nella raccolta.

print (intList.average ()) // stamperà 2.6666666666666665

La maggior parte di queste funzioni di estensione sono disponibili nella libreria standard delle raccolte Kotlin. Si consiglia di consultare la documentazione per conoscere gli altri.

Conclusione

In questo tutorial, hai imparato a conoscere le API della serie e delle raccolte nel linguaggio di programmazione Kotlin. Nel prossimo tutorial della serie Kotlin From Scratch, ti verranno presentate le funzioni di Kotlin. A presto!

Per saperne di più sulla lingua di Kotlin, ti consiglio di visitare la documentazione di Kotlin. Oppure guarda alcuni dei nostri altri post di sviluppo di app per Android qui su Envato Tuts!