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.