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.