Listák Groovy-ban

1. Áttekintés

A Groovy-ban ugyanúgy dolgozhatunk listákkal, mint a Java-ban. De a kiterjesztési módszerek támogatásával jóval többet szállít.

Ebben az oktatóanyagban megvizsgáljuk Groovy által végzett mutációk, szűrések és válogatások listáját.

2. Groovy listák készítése

A Groovy bizonyos érdekes parancsikonokat biztosít a gyűjteményekkel való munkavégzés során, amely támogatja a dinamikus gépelést és a szó szerinti szintaxist.

Kezdjük azzal, hogy létrehozunk egy listát néhány értékkel a gyorsírás szintaxisa segítségével:

def lista = [1,2,3]

Hasonlóképpen létrehozhatunk egy üres listát:

def emptyList = []

Alapértelmezés szerint Groovy létrehozza a java.util.ArrayList. Azonban, megadhatjuk a létrehozandó lista típusát is:

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

Ezután a listák felhasználhatók más listák létrehozására egy konstruktor argumentum használatával:

def copyList = new ArrayList (arrList)

vagy klónozással:

def cloneList = arrList.clone ()

Vegye figyelembe, hogy a klónozás a lista sekély másolatát hozza létre.

Groovy a „==” operátorral hasonlítja össze két lista elemeit az egyenlőség érdekében. Az előző példával folytatva, az összehasonlításról cloneList val vel arrlist az eredmény az igaz:

assertTrue (cloneList == arrList)

Most nézzük meg, hogyan lehet néhány általános műveletet végrehajtani a listákon.

3. Elemek lekérése egy listáról

Elemeket kaphatunk egy listáról a szó szerinti szintaxissal, például:

def list = ["Helló", "Világ"] assertTrue (lista [1] == "Világ")

vagy a kap() és elér() mód:

assertTrue (list.get (1) == "Világ") assertTrue (list.getAt (1) == "Világ")

A listáról is kaphatunk elemeket pozitív és negatív indexek felhasználásával. Negatív index használata esetén a lista jobbról balra olvasható:

assertTrue (list [-1] == "Világ") assertTrue (list.getAt (-2) == "Hello")

Vegye figyelembe, hogy a kap() A módszer nem támogatja a negatív indexeket.

4. Elemek hozzáadása egy listához

Az elemek listára történő felvételéhez többféle gyorsírás van. Adjon meg egy üres listát, és adjon hozzá néhány elemet:

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

Ezután megadhatjuk azt az indexet is, amelyre az elemet fel akarjuk helyezni. Is, ha a lista hossza kisebb, mint a megadott index, akkor Groovy annyit ad hozzá nulla értékek, mint különbség:

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

Végül használhatjuk a+=” operátor új elemek felvételére a listára. A többi megközelítéshez képest ez az operátor létrehoz egy új listaobjektumot és hozzárendeli a változóhoz lista:

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

5. A listában szereplő elemek frissítése

A lista elemeit a szó szerinti szintaxis vagy a segítségével frissíthetjük készlet() módszer:

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

Ebben a példában az 1. és a 2. index elemei frissülnek új értékekkel.

6. Tételek eltávolítása a listáról

Eltávolíthatunk egy elemet egy adott indexből a eltávolítás () módszer:

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

Vagy eltávolíthatunk egy elemet a removeElement () módszer. Ez eltávolítja az elem első előfordulását a listából:

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

Ezenkívül használhatjuk a mínusz operátor eltávolíthatja az elem minden előfordulását a listából. Ez az operátor azonban nem mutálja az alapul szolgáló listát - új listát ad vissza:

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

7. Ismétlés egy listán

Groovy új módszerekkel egészítette ki a meglévő Java-t Gyűjtemények API. Ezek a módszerek egyszerűsítik az olyan műveleteket, mint a szűrés, keresés, rendezés, összesítés stb., A kazánlap kódolásával. Emellett sokféle bemenetet támogatnak, beleértve a bezárásokat és a kimeneti adatszerkezeteket.

Kezdjük azzal, hogy megvizsgáljuk a lista feletti iterálás két módszerét.

A minden egyes() módszer elfogadja a lezárást, és nagyon hasonlít a az egyes() metódus Java-ban. Groovy átad egy implicit paramétert azt amely megfelel az egyes iterációk aktuális elemének:

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

A másik módszer, eachWithIndex () megadja az aktuális indexértéket az aktuális elem mellett:

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

8. Szűrés

A szűrés egy másik művelet, amelyet gyakran végeznek a listákon, és a Groovy számos különböző módszert kínál, amelyek közül választhat.

Definiáljunk egy működési listát:

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

Megtalálni az első objektumot, amely megfelel egy általunk használt feltételnek megtalálja:

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

Megtalálni az összes olyan objektumot, amely megfelel egy általunk használt feltételnek Találd meg mindet:

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

Nézzünk meg egy másik példát. Itt szeretnénk felsorolni az összes elemet, amely szám:

assertTrue (filterList.findAll {Szám példánya = = [2,1,3,4,5,6,76])

Alternatív megoldásként használhatjuk a grep módszer ugyanarra a dologra:

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

A különbség grep és megtalálja módszerek az grep elfogadhat egy Tárgy vagy a Bezárás érvként. Így lehetővé teszi a feltételfeltétel további csökkentését a minimumra:

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

Ezenkívül grep használ Object # isCase (java.lang.Object) hogy értékelje a lista egyes elemeinek állapotát.

Néha csak a lista egyedi elemei érdekelhetnek minket. Két túlterhelt módszer létezik, amelyeket erre a célra használhatunk.

A egyedi() A módszer opcionálisan elfogad egy lezárást, és csak azokat az elemeket tartja az alapul szolgáló listában, amelyek megfelelnek a bezárási feltételeknek, miközben másokat elvet. Alapértelmezésben a természetes rendezést használja az egyediség meghatározásához:

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

Alternatív megoldásként, ha nem az a követelmény, hogy az alapul szolgáló listát módosítsuk, akkor használhatjuk a toUnique () módszer:

assertTrue (["A", "B", "Ba", "Denevér", "Macska"]. toUnique {it.size ()} == ["A", "Ba", "Denevér"])

Ha azt akarjuk ellenőrizni, hogy a lista egy része vagy az összes eleget tesz-e egy bizonyos feltételnek, használhatjuk a minden() és Bármi() mód.

A minden() A módszer a bezárás állapotát értékeli a lista minden eleméhez képest. Ezután csak visszatér igaz ha a lista összes eleme megfelel a feltételnek:

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

A Bármi() metódus viszont visszatér igaz ha a lista bármely eleme megfelel a feltételnek:

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

9. Rendezés

Alapértelmezés szerint a Groovy a tételeket a listában rendezi a természetes sorrendjük alapján:

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

De átmehetünk a Összehasonlító egyedi rendezési logikával:

Összehasonlító mc = {a, b -> a == b? 0: a <b? 1: -1} def lista = [1,2,1,0] lista. Rendezés (mc) assertTrue (lista == [2,1,1,0])

Ezenkívül használhatjuk a perc () vagy max () módszerek a maximális vagy minimális érték megtalálásához, kifejezett felhívás nélkül fajta():

def strList = ["na", "ppp", "as"] assertTrue (strList.max () == "ppp")
Összehasonlító minc = {a, b -> a == b? 0: a <b? -1: 1} def numberList = [3, 2, 0, 7] assertTrue (számLista.min (minc) == 0)

10. Gyűjtés

Előfordulhat, hogy módosítanunk kell a lista elemeit, és egy újabb listát adunk vissza frissített értékekkel. Ez a gyűjt() módszer:

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

11. Csatlakozás

Időnként előfordulhat, hogy egyesítenünk kell a listán szereplő elemeket. Ehhez megtehetjük a csatlakozik() módszer:

assertTrue (["egy", "kettő", "három"]. csatlakozzon (",") == "egy, kettő, három")

12. Következtetés

Ebben a cikkben bemutattunk néhányat, amelyeket Groovy hozzáadott a Java-hoz Gyűjtemények API.

Azzal kezdtük, hogy megnéztük a szó szerinti szintaxist, majd annak használatát a listában szereplő elemek létrehozásában, frissítésében, eltávolításában és visszakeresésében.

Végül megvizsgáltuk Groovy támogatását a listák iterálásához, szűréséhez, kereséséhez, gyűjtéséhez, összekapcsolásához és rendezéséhez.

Mint mindig, a cikkben tárgyalt összes példa elérhető a GitHub oldalon.