Elemek keresése a Groovy-gyűjteményekben
1. Bemutatkozás
A Groovy jelentős számú módszert kínál a Java alapvető képességeinek fejlesztésére.
Ebben az oktatóanyagban megmutatjuk, hogy Groovy hogyan csinálja ezt mikor elem keresése és megtalálása többféle gyűjteményben.
2. Tesztelje, hogy van-e elem
Először csak a tesztelésre fogunk összpontosítani, ha egy adott gyűjtemény tartalmaz elemet.
2.1. Lista
A Java maga többféle lehetőséget kínál a listában szereplő elem ellenőrzése a java.util.List:
- A tartalmazza módszer
- A indexe módszer
Mivel a Groovy Java-kompatibilis nyelv, nyugodtan használhatjuk őket.
Nézzünk meg egy példát:
@Test void whenListContainsElement_thenCheckReturnsTrue () {def list = ['a', 'b', 'c'] assertTrue (list.indexOf ('a')> -1) assertTrue (list.contains ('a'))}
Eltekintve attól, hogy, Groovy bemutatja a tagsági szolgáltatót:
elem a listában
Ez egyike a sok szintaktikus cukorkezelőnek, amelyet Groovy nyújt. Segítségével egyszerűsíthetjük kódunkat:
@Test void whenListContainsElement_thenCheckWithMembershipOperatorReturnsTrue () {def list = ['a', 'b', 'c'] assertTrue ('a' a listában)}
2.2. Készlet
Az előző példához hasonlóan használhatjuk a java.util.Set # tartalmazza módszer és a ban ben operátor:
@Test void whenSetContainsElement_thenCheckReturnsTrue () {def set = ['a', 'b', 'c'] as Set assertTrue (set.contains ('a')) assertTrue ('a' in set)}
2.3. Térkép
Abban az esetben, ha a Térkép, közvetlenül ellenőrizhetjük a kulcsot vagy az értéket:
@Test void whenMapContainsKeyElement_thenCheckReturnsTrue () {def map = [a: 'd', b: 'e', c: 'f'] assertTrue (map.containsKey ('a')) assertFalse (map.containsKey ('e')) ) assertTrue (map.containsValue ('e'))}}
Vagy használja a tagsági operátort a megfelelő kulcs megtalálásához:
@Test void whenMapContainsKeyElement_thenCheckByMembershipReturnsTrue () {def map = [a: 'd', b: 'e', c: 'f'] assertTrue ('a' térképen) assertFalse ('f' térképen)}
Ha térképekkel használjuk, körültekintően kell használnunk a tagsági operátort, mert ez az operátor kissé zavaros a logikai értékekkel. A kulcs jelenlétének tesztelése helyett az alapul szolgáló mechanizmus lekéri a megfelelő értéket a térképről, és csak logikai értékre dobja:
@Test void whenMapContainsFalseBooleanValues_thenCheckReturnsFalse () {def map = [a: true, b: false, c: null] assertTrue (map.containsKey ('b')) assertTrue ('a' térképen) assertFalse ('b' a térképen) assertFalse ('c' a térképen)}
Amint a fenti példában láthatjuk, ez is egy kicsit veszélyes használni nulla értékek akár ugyanazon okból. Groovy mindkettőt leadja hamis és nulla logikai hamis.
3. Minden mérkőzés és bármilyen mérkőzés
A legtöbb esetben összetettebb tárgyakból álló gyűjteményekkel foglalkozunk. Ebben a szakaszban megmutatjuk, hogyan lehet ellenőrizni, hogy az adott gyűjtemény tartalmaz-e legalább egy megfelelő elemet, vagy minden elem megfelel-e egy adott állítmánynak.
Kezdjük egy egyszerű osztály meghatározásával, amelyet a példáinkban használunk:
osztály Személy {privát karakterlánc keresztnév privát karakterlánc vezetéknév privát egész kor // kivitelező, fogadó és beállító}
3.1. Lista / készlet
Ezúttal egy egyszerű listát fogunk használni Személy tárgyak:
végső magánszemélyLista = [új személy ("Regina", "Fitzpatrick", 25), új személy ("Abagail", "Ballard", 26), új személy ("Lucian", "Walter", 30),]
Mint korábban említettük, A Groovy Java-kompatibilis nyelv, tehát először hozzunk létre egy példát a Folyam A Java 8 által bevezetett API:
@Test void givenListOfPerson_whenUsingStreamMatching_thenShouldEvaluateList () {assertTrue (personList.stream (). AnyMatch {it.age> 20}) assertFalse (personList.stream (). AllMatch {it.age <30})}
Használhatjuk a Groovy módszereket is DefaultGroovyMethods # any és DefaultGroovyMethods # minden amelyek közvetlenül a gyűjteményen végzik az ellenőrzést:
@Test void givenListOfPerson_whenUsingCollectionMatching_thenShouldEvaluateList () {assertTrue (personList.any {it.age> 20}) assertFalse (personList.every {it.age <30})}
3.2. Térkép
Kezdjük azzal, hogy meghatározzuk a Térkép nak,-nek Személy által feltérképezett tárgyak # Személy keresztnév:
térkép = [Regina: új személy ("Regina", "Fitzpatrick", 25), Abagail: új személy ("Abagail", "Ballard", 26), Lucian: új személy ("Lucian", "Walter", (30)]
Értékelhetjük kulcsaival, értékeivel vagy egész bejegyzéseivel. Ismét először használjuk a Folyam API:
@Test void givenMapOfPerson_whenUsingStreamMatching_thenShouldEvaluateMap () {assertTrue (personMap.keySet (). Stream (). AnyMatch {it == "Regina"}) assertFalse (personMap.keySet (). Stream (). AllMatch {it == ) assertFalse (personMap.values (). stream (). allMatch {it.age <30}) assertTrue (personMap.entrySet (). stream (). anyMatch {it.key == "Abagail" && it.value.lastname == "Ballard"})}
Ezután a Groovy Collection API:
@Test void givenMapOfPerson_whenUsingCollectionMatching_thenShouldEvaluateMap () {assertTrue (personMap.keySet (). Any {it == "Regina"}) assertFalse (personMap.keySet (). Every {it == "Albert"}) assertFalse (personM .every {it.age utónév == "Abagail" && person.lastname == "Ballard"})}
Mint láthatjuk, Groovy nemcsak helyettesíti a Folyam Az API a térképek manipulálásakor, de lehetővé teszi számunkra, hogy közvetlenül a Térkép objektum helyett java.util.Map # entrySet módszer.
4. Keressen egy vagy több elemet egy gyűjteményben
4.1. Lista / készlet
Elemeket is kinyerhetünk predikátumokkal. Kezdjük az ismerőssel Folyam API-megközelítés:
@Test void givenListOfPerson_whenUsingStreamFind_thenShouldReturnMatchingElements () {assertTrue (personList.stream (). Filter {it.age> 20} .findAny (). IsPresent ()) assertFalse (personList.stream (). Filter {it.age >ny}. () .isPresent ()) assertTrue (personList.stream (). filter {it.age> 20} .findAll (). size () == 3) assertTrue (personList.stream (). filter {it.age> 30 } .findAll (). isEmpty ())}
Mint láthatjuk, a fenti példa használja java.util.Opcionális hogy egyetlen elemet találjon meg Folyam Az API kényszeríti ezt a megközelítést.
Másrészt a Groovy sokkal kompaktabb szintaxist kínál:
@Test void givenListOfPerson_whenUsingCollectionFind_thenShouldReturnMatchingElements () {assertNotNull (personList.find {it.age> 20}) assertNull (personList.find {it.age> 30}) assertTrue (personList.findAll {it.age = {}. = 3) assertTrue (personList.findAll {it.age> 30} .isEmpty ())}
A Groovy API használatával kihagyhatjuk a létrehozását Folyam és leszűrjük.
4.2. Térkép
Abban az esetben, ha a Térkép, több lehetőség közül lehet választani. Elemeket találhatunk kulcsok, értékek vagy teljes bejegyzések között. Mivel az első kettő alapvetően a Lista vagy a Készlet, ebben a szakaszban csak példát mutatunk bejegyzések keresésére.
Használjuk újból personTérkép korábbi:
@Test void givenMapOfPerson_whenUsingStreamFind_thenShouldReturnElements () {assertTrue (personMap.entrySet (). Stream () .filter {it.key == "Abagail" && it.value.lastname == "Ballard"} .findAny (). assertTrue (personMap.entrySet (). stream () .filter {it.value.age> 20} .findAll (). size () == 3)}
És még egyszer, az egyszerűsített Groovy megoldás:
@Test void givenMapOfPerson_whenUsingCollectionFind_thenShouldReturnElements () {assertNotNull (personMap.find {it.key == "Abagail" && it.value.lastname == "Ballard"}) assertTrue (personMap.findAze> 20 it.value. () == 3)}
Ebben az esetben az előnyök még jelentősebbek. Kihagyjuk a java.util.Map # entrySet módszert és zárót használjon a Térkép.
5. Következtetés
Ebben a cikkben bemutattuk, hogyan Groovy leegyszerűsíti az elemek ellenőrzését és megtalálását többféle gyűjteményben.
Mint mindig, ebben az oktatóanyagban használt teljes kódpéldák elérhetők a GitHubon.