Kotlin From Scratch Ranges and Collections

Kotlin er et moderne programmeringsspråk som kompilerer til Java bytecode. Det er gratis og åpen kildekode, og lover å gjøre koding for Android enda morsommere.

I den forrige artikkelen i denne serien lærte du om nullabilitet, looper og forhold i Kotlin. I denne opplæringen fortsetter vi å lære språket ved å se på utvalgs- og samlings API i Kotlin.

1. Ranger

Et område i Kotlin er en unik type som definerer en startverdi og en sluttverdi. Med andre ord er det et intervall mellom en start og en sluttverdi. Rangene i Kotlin er stengt, noe som betyr at startverdien og sluttverdien er inkludert i serien. 

Vi ser nå på forskjellige måter å skape områder i Kotlin.

De ...  Operatør

val oneToFive = 1 ... 5

I koden ovenfor har vi opprettet et lukket område. Denne variabelen oneToFive vil inneholde følgende verdier: 1, 2, 3, 4, 5. Vi kan sløyfe over det ved hjelp av til loop konstruksjon.

for (n i oneToFive) print (n)

Koden ovenfor kan forkortes til:

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

Vi kan også lage en rekke tegn:

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

Variabelen Atoz vil ha alle bokstavene i det engelske alfabetet.

De rangeTo () Funksjon

De ... operatør kan erstattes med rangeTo () utvidelsesfunksjon for å lage en rekkevidde. For eksempel kan vi også gjøre dette 1.rangeTo (5) og det vil fortsatt ha de samme resultatene som å bruke ...  operatør som diskutert tidligere. 

val oneToFive: IntRange = 1.rangeTo (5)

De ned til() Funksjon

Dette er en annen utvidelsesfunksjon som vil skape et område som starter fra et gitt nummer ned til en annen.

val fiveToOne = 5.downTo (1)

Vi kan endre rekkevidden ved hjelp av skritt() funksjon. Dette vil endre deltaet mellom hvert element i området.

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

Koden ovenfor inneholder ulige tall mellom 1 og 10.

De i Operatør

De i Operatør brukes til å finne ut om en verdi er tilstede i et gitt område.

hvis (5 i 1 ... 10) utskrift ("Ja 5 er i området") // utskrifter "Ja 5 er i området"

I koden ovenfor sjekket vi for å se om 5 er i området 1 ... 10 ved hjelp av i operatør. Vi kan også gjøre det motsatte ved å bruke !n for å sjekke om 5 ikke er i området.

2. Samlinger

Samlinger brukes til å lagre grupper av relaterte objekter i minnet. I en samling kan vi hente, lagre eller organisere objektene. Kotlin tilbyr sin samlings-API som et standardbibliotek som er bygget på toppen av Java Collection API. (Vi diskuterer grensesnitt i Kotlin i et fremtidig innlegg.) 

Du bør være oppmerksom på at disse grensesnittene er knyttet til implementeringen på kompileringstidspunktet. Du kan ikke se implementeringskilden i Kotlin, fordi samlingene faktisk implementeres av standard Java-samlinger som ArraylistMapsHashMapSetteneHashSetListe og så videre. For å virkelig forstå samlings API i Kotlin, må du være kjent med disse grunnleggende klassene og grensesnittene i Java.

I denne delen lærer vi om Liste, Sett og Kart samlinger i Kotlin. (Hvis du vil ha en oppdatering på arrays i Kotlin, vennligst besøk den første opplæringen i denne serien.) 

Kotlins samlinger gir oss muligheten til å oppnå mye med bare en liten kode - i motsetning til Java, som synes å trenge mye kode for å oppnå litt! Kotlin har to varianter av samlinger: mutable og immutable. En mutable samling gir oss muligheten til å modifisere en samling ved enten å legge til, fjerne eller erstatte et element. Uendelige samlinger kan ikke endres og har ikke disse hjelpemetodene. 

Vær oppmerksom på at tillegg, fjerning eller utskifting av et element i en uforanderlig samling er mulig via operatørfunksjoner (det kommer vi snart til), men dette vil ende opp med å skape en ny samling.

De Iterable Interface

The Kotlin Iterable grensesnittet er øverst i samlingsklassehierarkiet. Dette grensesnittet gjør at samlinger kan representeres som en sekvens av elementer (som kan bli iterert over, naturlig). 

offentlig grensesnitt Iterable offentlig abstrakt operatør morsom iterator (): Iterator 

De Samling Interface

The Kotlin Samling grensesnittet utvider Iterable grensesnitt. De Samling grensesnittet er uforanderlig. Med andre ord har du skrivebeskyttet tilgang til samlinger. De Sett og Liste grensesnitt (mer om disse kort tid) i Kotlin utvide dette grensesnittet. 

Noen av funksjonene og egenskapene som er tilgjengelige i Samling grensesnittet er:

  • størrelse: Denne egenskapen returnerer størrelsen på samlingen.
  • er tom(): returnerer sant hvis samlingen er tom eller falsk på annen måte. 
  • inneholder (element: E): returnerer sant hvis elementet som er angitt i argumentet, finnes i samlingen.
  • inneholderAlle (element: samling): returnerer sant hvis elementet i samlingen passert som argument er tilstede i samlingen.  
offentlig grensesnitt samling : Iterable offentlig valstørrelse: Int offentlig moro erEmpty (): Boolsk offentlig operatør moro inneholder (element: @UnsafeVariance E): Boolsk overstyring morsom iterator (): Iterator offentlig moro inneholder alle (elementer: samling<@UnsafeVariance E>): Boolsk

De MutableIterable Interface

Dette grensesnittet i Kotlin gir oss en spesialisert, muterbar iterator fra foreldrene Iterable grensesnitt.

offentlig grensesnitt MutableIterable : Iterable overstyre morsom iterator (): MutableIterator 

De MutableCollection Interface

De MutableCollection Grensesnittet i Kotlin er et spesialisert grensesnitt som gjør at samlinger kan være mutable. Med andre ord kan legge til og fjerne operasjoner utføres på en gitt samling. Dette grensesnittet utvider både Samling grensesnitt og MutableIterable grensesnitt allerede diskutert ovenfor. De MutableSet og MutableList grensesnitt (vi kommer til dem kort tid) i Kotlin utvide dette grensesnittet. Funksjonene som er tilgjengelige i dette grensesnittet, bortsett fra de som er tilgjengelige i sine foreldre, er:

  • legg til (element: E): legger elementet som et argument til samlingen og returnerer sant hvis vellykket eller falskt hvis samlingen ikke støtter duplikater og elementet er allerede til stede.
  • fjern (element: E): Fjerner elementet bestått som et argument fra samlingen. Returnerer sant hvis vellykket eller falskt hvis det ikke var tilstede i samlingen.
  • addAll (elementer: Samling): legger til alle elementene i samlingen bestått som argumenter til samlingen. Returnerer sant hvis vellykket eller falskt hvis ingenting ble lagt til.
  • removeAll (elementer: Samling): fjerner alle elementene som er tilstede i samlingen bestått som argumenter. Returnerer sant hvis vellykket eller falskt hvis ingenting ble fjernet.
  • beholdAll (elementer: Samling): beholder bare elementene som er tilstede i samlingene som er gått som argumenter. Returnerer sant hvis vellykket eller falskt hvis ingenting ble beholdt. 
  • klar(): fjerner alle elementer fra denne samlingen.
offentlig grensesnitt MutableCollection : Innsamling, MutableIterable overstyre morsom iterator (): MutableIterator offentlig moro legge til (element: E): Boolsk offentlig moro fjerne (element: E): Booleansk offentlig moro addAll (elementer: Samling): Boolsk offentlig moro fjerneAlle (elementer: Samling): Boolsk offentlig moro beholdeAlle (elementer: Samling): Boolsk offentlig morsomhet (): Enhet

Nå har du lært om de beste grensesnittene i kollektivklassehierarkiet i Kotlin, la oss se på hvordan Kotlin håndterer samlinger som Lister, sett og kart i den gjenværende delen av opplæringen.

lister

En liste er en bestilt samling av elementer. Dette er en populær samling som er mye brukt. La oss se på forskjellige måter å lage en liste på i Kotlin.

Bruker liste over() Funksjon

I Kotlin kan vi lage en uforanderlig (skrivebeskyttet) liste ved hjelp av liste over() hjelpefunksjon fra Kotlin standardbiblioteket. Denne funksjonen returnerer en Kotlin Liste grensesnitt type.

var tall: Liste = listOf (1, 2, 3, 4, 5) var navn: Liste = listOf ("Chike", "Nnamdi", "Mgbemena") for (navn i navn) println (navn)

Kjører koden over vil skrive ut: 

Chike Nnamdi Mgbemena

Videre kan vi passere verdier av forskjellige typer inn i liste over() Som argumenter og resultatet vil fortsatt fungere, vil det være en liste over blandet type. 

var listMixedTypes = listOf ("Chike", 1, 2.445, s)) // vil fortsatt samle 

Bruker emptyList () Funksjon

Denne funksjonen oppretter bare en tom, uforanderlig liste og returnerer en Kotlin Liste grensesnitt type.

Val emptyList: List = tomliste() 

Bruker listOfNotNull () Funksjon

Denne funksjonen oppretter en ny, uforanderlig liste som bare inneholder elementer som ikke er null. Legg merke til at denne funksjonen returnerer en Kotlin Liste grensesnitt type også.

Val nonNullsList: Liste = listOfNotNull (2, 45, 2, null, 5, null)

De Liste grensesnittet fra Kotlin standardbiblioteket utvider bare Samling grensesnitt. Med andre ord er det eneste foreldre som er Samling grensesnitt. Det overstyrer alle funksjonene i overordnet grensesnitt for å imøtekomme sine spesielle behov og definerer også sine egne funksjoner, for eksempel:

  • få (indeks: Int): en funksjonsoperatør som returnerer elementet til den angitte indeksen. 
  • indexOf (element: E): Returnerer indeksen for den første forekomsten av elementet som er bestått som et argument i listen, eller -1 hvis ingen er funnet.
  • lastIndexOf (element: E): Returnerer indeksen for den siste forekomsten av elementet som er bestått som et argument i listen, eller -1 hvis ingen er funnet. 
  • listIterator (): Returnerer en liste iterator over elementene i listen.
  • underliste (fromIndex: Int, toIndex: Int): Returnerer en liste som inneholder delen av listen mellom de angitte start- og sluttindeksene. 
println (names.size) // 3 println (names.get (0)) // "Chike" println (names.indexOf ("Mgbemena")) // 2 println (names.contains ("Nnamdi")) // 'ekte'

Bruker arrayListOf () Funksjon

Dette skaper en gjørbar liste og returnerer en Java Arraylist type.

val strengliste: ArrayList = arrayListOf("Hei du der") 

Bruker mutableListOf () Funksjon

For å legge til, fjerne eller erstatte verdier i en liste, må vi gjøre listen en gjørbar. Vi kan konvertere en uforanderlig liste til en mutable ved å ringe funksjonen toMutableList () på listen. Vær imidlertid oppmerksom på at denne metoden vil opprette en ny liste.

var mutableNames1 = names.toMutableList () mutableNames1.add ("Ruth") // nå mutable og lagt til "Ruth" til liste

For å lage en gjørbar liste av en viss type fra grunnen, f.eks. string, vi bruker mutableListOf(), mens for blandede typer kan vi bare bruke mutableListOf () funksjonen i stedet.

// en mutabel liste av en bestemt type, f.eks. String val mutableListNames: MutableList = mutableListOf("Josh", "Kene", "Sanya") mutableListNames.add ("Mary") mutableListNames.removeAt (1) mutableListNames [0] = "Oluchi" // erstatter elementet i indeks 0 med "Oluchi" // a mutable liste over blandede typer val mutableListMixed = mutableListOf ("BMW", "Toyota", 1, 6,76, 'v')

Noen av disse funksjonene vil returnere a MutableList Kotlin-grensesnitt type. Dette grensesnittet utvider både MutableCollection og Liste grensesnitt diskutert tidligere i denne delen. De MutableList grensesnitt legger til metoder for gjenfinning eller substitusjon av et element basert på sin posisjon: 

  • sett (indeks: Int, element: E): erstatter et element i listen med et annet element. Dette returnerer elementet tidligere i den angitte posisjonen.
  • legg til (indeks: Int, element: E): legger inn et element på den angitte indeksen. 
  • removeAt (indeks: Int): blir kvitt elementet ved en bestemt indeks. 
Val mutableListFood: MutableList = mutableListOf("Rice & stew", "Jollof rice", "Eba & Egusi", "Fried rice") mutableListFood.remove ("Fried rice") mutableListFood.removeAt (0) mutableListFood.set (0, "Beans") mutableListFood. legg til (1, "Brød og te") for (foodName i mutableListFood) println (foodName)

Kjører koden ovenfor, produserer vi følgende resultat:

Bønner Brød og te Eba & Egusi

Merk at alle disse funksjonene lager en Java Arraylist Bak scenen.

Settene

Et sett er en uordnet samling av unike elementer. Med andre ord, det kan ikke ha noen duplikater! La oss se på noen av de forskjellige måtene å skape et sett i Kotlin. Hver av disse oppretter en annen datastruktur, som hver er optimalisert for en bestemt type oppgave. 

Bruker setof () Funksjon

For å lage et uforanderlig (skrivebeskyttet) sett i Kotlin, kan vi bruke funksjonen setof (), som returnerer en Kotlin Sett grensesnitt type. 

// lager et uforanderlig sett av blandede typer val mixedTypesSet = setOf (2, 4.454, "how", "langt", "c") // vil kompilere var intSet: Set = setOf (1, 3, 4) // kun heltallstyper tillatt

Legg merke til at Kotlin Sett grensesnittet utvider kun Kotlin Samling grensesnitt og overstyrer alle egenskapene som er tilgjengelige i sin overordnede.

Bruker hashSetOf () Funksjon 

Bruker hashSetOf () funksjonen skaper en Java HashSet samling som lagrer elementer i et hashbord. Fordi denne funksjonen returnerer en Java HashSet type, kan vi legge til, fjerne eller slette elementer i settet. Med andre ord, det er mutable. 

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

Bruker sortedSetOf () Funksjon

Bruker sortedSetOf () funksjonen skaper en Java TreeSet samling bak scenene, som bestiller elementer basert på deres naturlige bestilling eller av en komparator. Dette settet er også omgjengelig.

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

Bruker linkedSetOf () Funksjon

Denne funksjonen returnerer en Java LinkedHashSet type. Dette mutable settet opprettholder en koblet liste over oppføringene i settet, i den rekkefølgen de ble satt inn i. 

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

Bruker mutableSetOf () Funksjon

Vi kan bruke mutableSetOf () for å lage et gjensidig sett. Denne funksjonen returnerer en Kotlin MutableSet grensesnitt type. Bak kulissene skaper denne funksjonen bare en Java LinkedHashSet.  

// lager et muterbart sett med int typer bare val intsMutableSet: MutableSet = mutableSetOf (3, 5, 6, 2, 0) intsMutableSet.add (8) intsMutableSet.remove (3)

De MutableSet grensesnittet utvider både MutableCollection og Sett grensesnitt. 

Maps

Kart assosierer nøkler til verdier. Nøklene må være unike, men de tilhørende verdiene trenger ikke å være. På den måten kan hver nøkkel brukes til å identifisere den tilknyttede verdien unikt, siden kartet sørger for at du ikke kan ha dupliserte nøkler i samlingen. Bak kulissene bruker Kotlin Java Kart samling for å implementere sin kartsamlingstype.

Bruker mapOf () Funksjon

Å skape en uforanderlig eller skrivebeskyttet Kart samling i Kotlin, bruker vi mapOf () funksjon. Vi lager et kart med denne funksjonen ved å gi den en liste over par. Den første verdien er nøkkelen, og den andre er verdien. Å ringe denne funksjonen returnerer en Kotlin Kart grensesnitt type.

val callingCodesMap: Kart = mapOf (234 til "Nigeria", 1 til "USA", 233 til "Ghana") for ((nøkkel, verdi) i callingCodesMap) println ("$ nøkkelen er kallekoden for $ verdi") skriv ut (callingCodesMap [234]) // Nigeria

Kjører koden ovenfor vil gi resultatet: 

234 er kallekoden for Nigeria 1 er telefonnummeret til USA 233 er telefonnummeret for Ghana

I motsetning til Liste og Sett grensesnitt i Kotlin som strekker seg Samling grensesnittet, Kart grensesnittet utvider ikke noe i det hele tatt. Noen av egenskapene og funksjonene som er tilgjengelige i dette grensesnittet er:

  • størrelse: Denne egenskapen returnerer størrelsen på kartsamlingen.
  • er tom(): returnerer sant hvis kartet er tomt eller falskt ellers.
  • inneholderKey (nøkkel: K): returnerer sant hvis kartet inneholder nøkkelen i argumentet. 
  • inneholderValue (verdi: V): returnerer sant hvis kartet kartlegger en eller flere nøkler til verdien som er bestått som et argument.
  • få (nøkkel: K): returnerer verdien som matcher den gitte nøkkelen eller nullen hvis ingen er funnet. 
  • nøkler: Denne egenskapen returnerer en uforanderlig Sett av alle nøklene i kartet.
  • verdier: returnerer en uforanderlig Samling av alle verdiene i kartet.

Bruker mutableMapOf () Funksjon

De mutableMapOf () funksjonen skaper et gjørbart kart for oss slik at vi kan legge til og fjerne elementer i kartet. Dette returnerer en Kotlin MutableMap grensesnitt type.

Val currenciesMutableMap: MutableMap = mutableMapOf ("Naira" til "Nigeria", "Dollars" til "USA", "Pounds" til "UK") println ("Land er $ currenciesMutableMap.values") // Land er [Nigeria, USA, Storbritannia ] println ("Valuta er $ currenciesMutableMap.keys") // Valuta er [Naira, Dollars, Pounds] currenciesMutableMap.put ("Cedi", "Ghana") valutaerMutableMap.remove ("Dollars")

De MutableMap grensesnittet utvider ikke MutableCollection grensesnitt; det er bare foreldre er Kart grensesnitt. Det overstyrer nøklerinnganger og verdier egenskaper fra overordnet grensesnitt for å omdefinere dem. Her er noen av de ekstra funksjonene som er tilgjengelige i MutableMap grensesnitt:

  • put (nøkkel: K, verdi: V): legger inn nøkkelen, verdiparet i kartet. Dette vil returnere forrige verdi knyttet til nøkkelen eller null hvis nøkkelen ikke ble brukt tidligere. 
  • fjern (tast: K): fjerner nøkkelen og den tilknyttede verdien fra kartet. 
  • putt alle(fra: Kart): oppdaterer kartet med alle dataene fra det oppgitte kartet. Nye nøkler vil bli lagt til, og eksisterende nøkler vil bli oppdatert med nye verdier. 
  • klar(): fjerner alle elementene fra kartet. 

Vi kan få verdien for en nøkkel ved hjelp av få() funksjon. Vi kan også bruke firkantbrakettnotasjon som en snarvei for få()

print (currenciesMutableMap.get ("Nigeria")) // vil skrive ut Naira-utskrift (currenciesMutableMap ["Nigeria"]) // vil skrive ut Naira

Bruker hashMapOf () Funksjon

Ved hjelp av denne funksjonen returneres en Java HashMap type som er mutable. De HashMap klassen bruker et hashbord for å implementere Java Kart grensesnitt.  

Val personsHashMap: java.util.HashMap = hashMapOf (1 til "Chike", 2 til "John", 3 til "Emeka") personsHashMap.put (4, "Chuka") personerHashMap.remove (2) print (personsHashMap [1]) // vil skrive ut Chike

Bruker linkedHashMap () Funksjon

Denne funksjonen returnerer en Java LinkedHashMap type som er mutable. De LinkedHashMap klassen utvider Java HashMap og opprettholder en koblet liste over oppføringene i kartet i den rekkefølgen de ble satt inn i. 

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

Bruker sortedMapOf () Funksjon

Denne funksjonen returnerer en Java SortedMap type som er mutable. Java SortedMap klassen ser at oppføringene i kartet opprettholdes i en stigende nøkkelordre.

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

Husk at implementeringen av disse samlingsgrensesnittene i Kotlin skjer ved kompileringstid.

Samlinger Operasjonsfunksjoner

Kotlin gir oss mange nyttige operatørfunksjoner kalt utvidelsesfunksjoner som kan påberopes på samlinger. La oss ta en titt på noen av de mest nyttige.

De siste() Funksjon

Denne operatørfunksjonen returnerer det siste elementet i en samling, for eksempel en liste eller et sett. Vi kan også levere et predikat for å søke i et delsett av elementer.

val strengliste: Liste = listOf ("in", "the", "club") print (stringList.last ()) // vil skrive ut "club" // gitt en predikatutskrift (stringList.last it.length == 3) / / vil skrive ut "valget intSet: Set = setOf (3, 5, 6, 6, 6, 3) print (intSet.last ()) // vil skrive ut 6

De først() Funksjon

Denne operatørfunksjonen returnerer det første elementet når det påkreves på en samling, for eksempel en liste eller et sett. Hvis et predikat er gitt, bruker det deretter predikatet til å begrense operasjonen til en delmengde av elementer.

print (stringList.first ()) // vil skrive ut "i" print (intSet.first ()) // vil skrive ut 3

De max () Funksjon

Hvis du bruker denne operatørfunksjonen på en samling som en liste eller et sett, returneres det største elementet, eller null hvis ikke det største elementet er funnet.

Val intList: Liste = listOf (1, 3, 4) print (intList.max ()) // vil skrive ut 4 utskrift (intSet.max ()) // vil skrive ut 6 

De miste() Funksjon

Kaller denne operatørfunksjonen returnerer en ny liste eller et sett som inneholder alle elementene unntatt de første n-elementene.

print (stringList.drop (2)) // vil skrive ut "klubb"

De i tillegg til() Funksjon

Denne operatørfunksjonen returnerer en samling som inneholder alle elementene i originalen og deretter det gitte elementet hvis det ikke allerede er i samlingen. Dette vil ende med å opprette en ny liste i stedet for å endre listen.

print (intList.plus (6)) // vil skrive ut [1, 3, 4, 6]

De minus() Funksjon

Det motsatte av i tillegg til() funksjonen er minus() funksjon. Den returnerer en samling som inneholder alle elementene i det opprinnelige settet, bortsett fra det gitte elementet. Dette endes også med å opprette en ny liste i stedet for å endre listen.

print (intList.minus (3)) // vil skrive ut [1, 4]

De gjennomsnitt() Funksjon

Å ringe denne operatørfunksjonen returnerer et gjennomsnittlig antall elementer i samlingen.

print (intList.average ()) // vil skrive ut 2.6666666666666665

De fleste av disse utvidelsesfunksjonene er tilgjengelige i Kotlin-samlingenes standardbibliotek. Det anbefales at du sjekker ut dokumentasjonen for å lære om de andre.

Konklusjon

I denne opplæringen har du lært om utvalgs- og samlings API i Kotlins programmeringsspråk. I neste opplæring i Kotlin From Scratch-serien blir du introdusert til funksjoner i Kotlin. Ser deg snart!

For å lære mer om Kotlin-språket, anbefaler jeg at du besøker Kotlin-dokumentasjonen. Eller sjekk ut noen av våre andre Android-apputviklingsposter her på Envato Tuts!