Lister i Groovy

1. Oversikt

I Groovy kan vi jobbe med lister akkurat som vi gjør i Java. Men med sin støtte for utvidelsesmetoder leveres den med ganske mye mer.

I denne opplæringen vil vi se på Groovys påmutering, filtrering og sortering av lister.

2. Opprette groovy-lister

Groovy gir visse interessante snarveier når du arbeider med samlinger som bruker støtten til dynamisk skriving og bokstavelig syntaks.

La oss begynne med å lage en liste med noen verdier ved hjelp av stenografi-syntaksen:

def liste = [1,2,3]

På samme måte kan vi lage en tom liste:

def tomListe = []

Som standard oppretter Groovy en forekomst av java.util.ArrayList. Derimot, vi kan også spesifisere hvilken type liste som skal opprettes:

def linkedList = [1,2,3] som LinkedList ArrayList arrList = [1,2,3]

Deretter kan lister brukes til å lage andre lister ved å bruke et konstruktørargument:

def copyList = ny ArrayList (arrList)

eller ved kloning:

def cloneList = arrList.clone ()

Merk at kloning skaper en grunne kopi av listen.

Groovy bruker operatøren “==” til å sammenligne elementene i to lister for likestilling. Fortsetter med forrige eksempel om sammenligning cloneList med arrliste resultatet er ekte:

assertTrue (cloneList == arrList)

La oss nå se på hvordan du utfører noen vanlige operasjoner på lister.

3. Hente elementer fra en liste

Vi kan få et element fra en liste ved hjelp av bokstavelig syntaks som:

def list = ["Hello", "World"] assertTrue (list [1] == "World")

eller bruke få() og få på() metoder:

assertTrue (list.get (1) == "Verden") assertTrue (list.getAt (1) == "Verden")

Vi kan også få varer fra en liste ved hjelp av både positive og negative indekser. Når en negativ indeks brukes, blir listen lest fra høyre til venstre:

assertTrue (liste [-1] == "Verden") assertTrue (list.getAt (-2) == "Hei")

Merk at få() metoden støtter ikke negative indekser.

4. Legge til elementer i en liste

Det er flere forkortelser for å legge til elementer i listen. La oss definere en tom liste og legge til noen få ting i den:

def list = [] list << 1 list.add ("Apple") assertTrue (list == [1, "Apple"])

Deretter kan vi også spesifisere indeksen for å plassere varen på. Også, hvis lengden på listen er mindre enn den indeksen som er angitt, legger Groovy til like mange null verdier som forskjell:

list [2] = "Box" list [4] = true assertTrue (list == [1, "Apple", "Box", null, true])

Til slutt kan vi bruke “+=” operatøren for å legge til nye elementer i listen. Sammenlignet med de andre tilnærmingene, denne operatøren oppretter et nytt listeobjekt og tilordner det til variabelen liste:

def list2 = [1,2] list + = list2 list + = 12 assertTrue (list == [1, 6.0, "Apple", "Box", null, true, 1, 2, 12])

5. Oppdatere elementer i en liste

Vi kan oppdatere elementer i en liste ved hjelp av bokstavelig syntaks eller sett() metode:

def list = [1, "Apple", 80, "App"] list [1] = "Box" list.set (2,90) assertTrue (list == [1, "Box", 90, "App"] )

I dette eksemplet oppdateres elementene i indeks 1 og 2 med nye verdier.

6. Fjerne elementer fra en liste

Vi kan fjerne et element ved en bestemt indeks ved hjelp av fjerne() metode:

def list = [1,2,3,4,5,5,6,6,7] list.remove (3) assertTrue (list == [1,2,3,5,5,6,6,7] )

Eller vi kan også fjerne et element ved å bruke removeElement () metode. Dette fjerner den første forekomsten av elementet fra listen:

list.removeElement (5) assertTrue (list == [1,2,3,5,6,6,7])

I tillegg vi kan bruke minus operatøren for å fjerne alle forekomster av et element fra listen. Denne operatøren muterer imidlertid ikke den underliggende listen - den returnerer en ny liste:

assertTrue (liste - 6 == [1,2,3,5,7])

7. Iterere på en liste

Groovy har lagt til nye metoder for eksisterende Java Samlinger API. Disse metodene forenkler operasjoner som filtrering, søk, sortering, aggregering osv. Ved å kapsle inn kokeplaten. De støtter også et bredt spekter av innganger, inkludert nedleggelser og utdatastrukturer.

La oss starte med å se på de to metodene for iterering over en liste.

De Hver() metoden godtar en lukking og ligner veldig på for hver() -metoden i Java. Groovy sender en implisitt parameter den som tilsvarer gjeldende element i hver iterasjon:

def list = [1, "App", 3,4] list.each {println it * 2}

Den andre metoden, eachWithIndex () gir gjeldende indeksverdi i tillegg til gjeldende element:

list.eachWithIndex {it, i -> println "$ i: $ it"}

8. Filtrering

Filtrering er en annen operasjon som ofte utføres på lister, og Groovy tilbyr mange forskjellige metoder å velge mellom.

La oss definere en liste å operere på:

def filterList = [2,1,3,4,5,6,76]

For å finne det første objektet som samsvarer med en tilstand vi kan bruke finne:

assertTrue (filterList.find {it> 3} == 4)

For å finne alle objekter som samsvarer med en tilstand vi kan bruke finn alle:

assertTrue (filterList.findAll {it> 3} == [4,5,6,76])

La oss se på et annet eksempel. Her ønsker vi en liste over alle elementene som er tall:

assertTrue (filterList.findAll {it instanceof Number} == [2,1,3,4,5,6,76])

Alternativt kan vi bruke grep metode for å gjøre det samme:

assertTrue (filterList.grep (Number) == [2,1,3,4,5,6,76])

Forskjellen mellom grep og finne metoder er det grep kan godta en Gjenstand eller a Lukking som argument. Dermed tillater det ytterligere å redusere tilstandsuttalelsen til et minimum:

assertTrue (filterList.grep {it> 6} == [76])

I tillegg grep bruker Objekt # isCase (java.lang.Object) for å evaluere tilstanden på hvert element i listen.

Noen ganger vi kan bare være interessert i de unike elementene i en liste. Det er to overbelastede metoder som vi kan bruke til dette formålet.

De unik() metoden aksepterer valgfritt en nedleggelse og holder i den underliggende listen bare elementer som samsvarer med lukkingsbetingelsene mens de forkaster andre. Den bruker naturlig bestilling som standard for å bestemme unikhet:

def uniqueList = [1,3,3,4] uniqueList.unique () assertTrue (uniqueList == [1,3,4])

Alternativt, hvis kravet ikke er å mutere den underliggende listen, kan vi bruke toUnique () metode:

assertTrue (["A", "B", "Ba", "Bat", "Cat"]. toUnique {it.size ()} == ["A", "Ba", "Bat"])

Hvis vi vil kontrollere at noen eller alle elementene i en liste tilfredsstiller en viss tilstand, kan vi bruke hver() og noen() metoder.

De hver() metoden evaluerer tilstanden i lukkingen mot hvert element i listen. Så kommer den bare tilbake ekte hvis alle elementene i listen tilfredsstiller betingelsen:

def conditionList = [2,1,3,4,5,6,76] assertFalse (conditionList.every {it <6})

De noen() metoden, derimot, returnerer ekte hvis noe element i listen tilfredsstiller betingelsen:

assertTrue (conditionList.any {it% 2 == 0})

9. Sortering

Som standard sorterer Groovy elementene i en liste basert på deres naturlige rekkefølge:

assertTrue ([1,2,1,0] .sort () == [0,1,1,2])

Men vi kan også passere en Komparator med tilpasset sorteringslogikk:

Komparator mc = {a, b -> a == b? 0: a <b? 1: -1} def list = [1,2,1,0] list.sort (mc) assertTrue (list == [2,1,1,0])

I tillegg kan vi bruke min () eller maks () metoder for å finne maksimums- eller minimumsverdien uten å uttrykkelig ringe sortere():

def strList = ["na", "ppp", "as"] assertTrue (strList.max () == "ppp")
Comparator minc = {a, b -> a == b? 0: a <b? -1: 1} def numberList = [3, 2, 0, 7] assertTrue (numberList.min (minc) == 0)

10. Samling

Noen ganger kan det være lurt å endre elementene i en liste og returnere en annen liste med oppdaterte verdier. Dette kan gjøres ved hjelp av samle inn() metode:

def list = ["Kay", "Henry", "Justin", "Tom"] assertTrue (list.collect {"Hei" + it} == ["Hei Kay", "Hei Henry", "Hei Justin", "Hei Tom"])

11. Bli med

Noen ganger kan det hende vi trenger å bli med på elementene i en liste. For å gjøre det kan vi bli med() metode:

assertTrue (["One", "Two", "Three"]. join (",") == "One, Two, Three")

12. Konklusjon

I denne artikkelen dekket vi noen av utvidelsene Groovy legger til Java Samlinger API.

Vi begynte med å se på bokstavelig syntaks og deretter bruken av den ved å lage, oppdatere, fjerne og hente gjenstander i en liste.

Til slutt så vi på Groovys støtte for iterering, filtrering, søk, samling, sammenføyning og sortering av lister.

Som alltid er alle eksemplene diskutert i artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found