Pronalaženje elemenata u kolekcijama u Groovyju

1. Uvod

Groovy nudi značajan broj metoda kojima se poboljšavaju osnovne Java sposobnosti.

U ovom uputstvu pokazat ćemo kako Groovy to čini kada provjera elementa i pronalazak u nekoliko vrsta zbirki.

2. Testirajte je li element prisutan

Prvo ćemo se usredotočiti na samo testiranje sadrži li zadana zbirka element.

2.1. Popis

Java sama nudi nekoliko načina za provjera stavke na popisu s java.util.Popis:

  • The sadrži metoda
  • The indexOf metoda

Budući da je Groovy jezik kompatibilan s Javom, možemo ih sigurno koristiti.

Pogledajmo primjer:

@Test void whenListContainsElement_thenCheckReturnsTrue () {def list = ['a', 'b', 'c'] assertTrue (list.indexOf ('a')> -1) assertTrue (list.contains ('a'))}

Osim toga, Groovy predstavlja operatora članstva:

element na popisu

To je jedan od mnogih sintaktičkih operatora šećera koje nudi Groovy. Uz njegovu pomoć možemo pojednostaviti naš kod:

@Test void whenListContainsElement_thenCheckWithMembershipOperatorReturnsTrue () {def list = ['a', 'b', 'c'] assertTrue ('a' na popisu)}

2.2. Postavi

Kao i u prethodnom primjeru, možemo koristiti java.util.Set # sadrži metoda i u operater:

@Test void whenSetContainsElement_thenCheckReturnsTrue () {def set = ['a', 'b', 'c'] kao Set assertTrue (set.contains ('a')) assertTrue ('a' in set)}

2.3. Karta

U slučaju a Karta, možemo izravno provjeriti ključ ili vrijednost:

@Test void whenMapContainsKeyElement_thenCheckReturnsTrue () {def map = [a: 'd', b: 'e', ​​c: 'f'] assertTrue (map.containsKey ('a')) assertFalse (map.containsKey ('e') ) assertTrue (map.containsValue ('e'))}

Ili upotrijebite operator članstva da biste pronašli odgovarajući ključ:

@Test void whenMapContainsKeyElement_thenCheckByMembershipReturnsTrue () {def map = [a: 'd', b: 'e', ​​c: 'f'] assertTrue ('a' in map) assertFalse ('f' in map)}

Kad se koristi s kartama, trebali bismo pažljivo koristiti operatora članstva jer ovaj je operator pomalo zbunjujući za upotrebu s logičkim vrijednostima. Umjesto da testira prisutnost ključa, temeljni mehanizam dohvaća odgovarajuću vrijednost s karte i pravedan baca ga u boolean:

@Test void whenMapContainsFalseBooleanValues_thenCheckReturnsFalse () {def map = [a: true, b: false, c: null] assertTrue (map.containsKey ('b')) assertTrue ('a' in map) assertFalse ('b' in map) assertFalse ('c' na karti)}

Kao što bismo mogli vidjeti u gornjem primjeru, to je također pomalo opasno za upotrebu null vrijednosti bilo iz istog razloga. Groovy baca oboje lažno i null na boolean lažno.

3. Sve utakmice i bilo koje utakmice

U većini slučajeva imamo posla s zbirkama sastavljenim od složenijih predmeta. U ovom ćemo odjeljku pokazati kako provjeriti sadrži li navedena zbirka barem jedan odgovarajući element ili se svi elementi podudaraju s datim predikatom.

Počnimo s definiranjem jednostavne klase koju ćemo koristiti u našim primjerima:

klasa Osoba {private String ime private String prezime private Integer age // konstruktor, getteri i postavljači}

3.1. Popis / Set

Ovaj put koristit ćemo jednostavan popis Osoba objekti:

privatna konačna personList = [nova osoba ("Regina", "Fitzpatrick", 25), nova osoba ("Abagail", "Ballard", 26), nova osoba ("Lucian", "Walter", 30),]

Kao što smo već spomenuli, Groovy je jezik kompatibilan s Javom, pa hajde da prvo stvorimo primjer pomoću Stream API koji je predstavila Java 8:

@Test void givenListOfPerson_whenUsingStreamMatching_thenShouldEvaluateList () {assertTrue (personList.stream (). AnyMatch {it.age> 20}) assertFalse (personList.stream (). AllMatch {it.age <30})}

Možemo se koristiti i Groovyjevim metodama DefaultGroovyMethods # bilo koji i DefaultGroovyMethods # svaki koji izvršavaju provjeru izravno na zbirci:

@Test void givenListOfPerson_whenUsingCollectionMatching_thenShouldEvaluateList () {assertTrue (personList.any {it.age> 20}) assertFalse (personList.every {it.age <30})}

3.2. Karta

Počnimo s definiranjem a Karta od Osoba predmeti mapirani po Osoba # ime:

privatna konačna osobaKarta = [Regina: nova osoba ("Regina", "Fitzpatrick", 25), Abagail: nova osoba ("Abagail", "Ballard", 26), Lucian: nova osoba ("Lucian", "Walter", 30)]

Možemo ga procijeniti prema ključevima, vrijednostima ili prema cijelim unosima. Opet, prvo upotrijebimo Stream 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"})}

A onda, Groovy Collection API:

@Test void givenMapOfPerson_whenUsingCollectionMatching_thenShouldEvaluateMap () {assertTrue (personMap.keySet (). Any {it == "Regina"}) assertFalse (personMap.keySet (). Every {it == "Albert"}) personMartMalse. .svako {it.age ime == "Abagail" && person.lastname == "Ballard"})}

Kao što vidimo, Groovy ne samo da adekvatno zamjenjuje Stream API prilikom manipulacije kartama, ali također nam omogućuje da izvršimo provjeru izravno na Karta objekt umjesto da koristi java.util.Map # entrySet metoda.

4. Pronađite jedan ili više elemenata u zbirci

4.1. Popis / Set

Elemente možemo izvući i pomoću predikata. Krenimo od poznatog Stream API pristup:

@Test void givenListOfPerson_whenUsingStreamFind_thenShouldReturnMatchingElements () {assertTrue (personList.stream (). Filter {it.age> 20} .findAny (). IsPresent ()) assertFalse (personList.stream ()}. Filter {itfindny 30>. () .isPresent ()) assertTrue (personList.stream (). filter {it.age> 20} .findAll (). size () == 3) assertTrue (personList.stream (). filter {it.age> 30 } .findAll (). isEmpty ())}

Kao što vidimo, gornji primjer koristi java.util.Izborno za pronalaženje jednog elementa kao Stream API forsira taj pristup.

S druge strane, Groovy nudi mnogo kompaktniju sintaksu:

@Test void givenListOfPerson_whenUsingCollectionFind_thenShouldReturnMatchingElements () {assertNotNull (personList.find {it.age> 20}) assertNull (personList.find {it.age> 30}) assertTrue (personList.findAll {personList.findAll. = 3) assertTrue (personList.findAll {it.age> 30} .isEmpty ())}

Korištenjem Groovyjevog API-ja, možemo preskočiti stvaranje a Stream i filtrirajući ga.

4.2. Karta

U slučaju a Karta, možete birati između nekoliko mogućnosti. Elemente možemo pronaći među ključevima, vrijednostima ili cjelovitim unosima. Kako su prva dva u osnovi a Popis ili a Postavi, u ovom ćemo odjeljku prikazati samo primjer pronalaska unosa.

Ponovno iskoristimo naše personMap od ranije:

@Test void givenMapOfPerson_whenUsingStreamFind_thenShouldReturnElements () {assertTrue (personMap.entrySet (). Stream () .filter {it.key == "Abagail" && it.value.lastname == "Ballard") .findAre () assertTrue (personMap.entrySet (). stream () .filter {it.value.age> 20} .findAll (). size () == 3)}

I opet, pojednostavljeno Groovy rješenje:

@Test void givenMapOfPerson_whenUsingCollectionFind_thenShouldReturnElements () {assertNotNull (personMap.find {it.key == "Abagail" && it.value.lastname == "Ballard"}) assertTrue (personMap.findlue All. () == 3)}

U ovom su slučaju blagodati još značajnije. Preskačemo java.util.Map # entrySet metodu i upotrijebite zatvarač s funkcijom predviđenom na Karta.

5. Zaključak

U ovom smo članku predstavili kako Groovy pojednostavljuje provjeru elemenata i njihovo pronalaženje u nekoliko vrsta zbirki.

Kao i uvijek, cjeloviti primjeri koda korišteni u ovom vodiču dostupni su na GitHub-u.


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