Karte u Groovy

1. Pregled

Groovy proširuje Karta API u Javi za pružiti metode za operacije poput filtriranja, pretraživanja i sortiranja. Također pruža a raznovrsni stenografski načini stvaranja i manipulacije mapama.

U ovom ćemo članku pogledati Groovyjev način rada s kartama.

2. Stvaranje Groovyja Kartas

Možemo se poslužiti doslovnom sintaksom karte [k: v] za izradu karata. U osnovi, omogućuje nam instanciranje karte i definiranje unosa u jednom retku.

Prazna karta može se stvoriti pomoću:

def emptyMap = [:]

Slično tome, mapa s vrijednostima može se izraditi pomoću:

def map = [ime: "Jerry", dob: 42, grad: "New York"]

Primijeti da tipke nisu okružene navodnicima.

I prema zadanim postavkama Groovy stvara instancu java.util.LinkedHashMap. Možemo nadjačati ovo zadano ponašanje pomoću kao operater.

3. Dodavanje predmeta

Počnimo s definiranjem karte:

def map = [name: "Jerry"]

Na kartu možemo dodati ključ:

karta ["dob"] = 42

Ali još jedan način sličniji Javascriptu je korištenje oznake svojstva (operatora točke):

map.city = "New York"

Drugim riječima, Groovy podržava pristup parovima ključ / vrijednost na zrno poput graha.

Također možemo koristiti varijable umjesto literala kao ključeve dok dodajemo nove stavke na kartu:

def hobbyLiteral = "hobby" def hobbyMap = [(hobbyLiteral): "Singing"] map.putAll (hobbyMap) assertTrue (hobbyMap.hobby == "Singing") assertTrue (hobbyMap [hobbyLiteral] == "Singing")

Prvo, moramo stvoriti novu varijablu koja pohranjuje ključ hobi. Zatim koristimo ovu varijablu priloženu u zagradama s doslovnom sintaksom karte da bismo stvorili novu kartu.

4. Dohvaćanje predmeta

Sintaksa slova ili notacija svojstava mogu se koristiti za dobivanje predmeta s karte.

Za kartu definiranu kao:

def map = [ime: "Jerry", dob: 42, grad: "New York", hobi: "Pjevanje"]

Možemo dobiti vrijednost koja odgovara ključu Ime:

assertTrue (map ["name"] == "Jerry")

ili

assertTrue (map.name == "Jerry")

5. Uklanjanje predmeta

Bilo koji unos s karte možemo ukloniti na temelju ključa pomoću ukloniti() metoda. Ali, ponekad ćemo možda trebati ukloniti više unosa s karte. To se može učiniti pomoću minus() metoda.

The minus() metoda prihvaća a Karta. I vraća novu Karta nakon uklanjanja svih unosa dane karte s osnovne karte:

def map = [1:20, a: 30, 2:42, 4:34, ba: 67, 6:39, 7:49] def minusMap = map.minus ([2:42, 4:34]); assertTrue (minusMap == [1:20, a: 30, ba: 67, 6:39, 7:49])

Dalje, unose možemo ukloniti i na temelju stanja. To se može postići pomoću ukloniti sve() metoda:

minusMap.removeAll {it -> it.key instanceof String} assertTrue (minusMap == [1:20, 6:39, 7:49])

Suprotno tome, da bismo zadržali sve unose koji zadovoljavaju uvjet, možemo koristiti retainAll () metoda:

minusMap.retainAll {it -> it.value% 2 == 0} assertTrue (minusMap == [1:20])

6. Iteriranje kroz unose

Možemo se itirirati kroz unose pomoću svaki()i eachWithIndex () metode.

The svaki() metoda pruža implicitne parametre poput ulazak, ključ, i vrijednost koji odgovaraju struji Ulazak.

The eachWithIndex () metoda pored indeksa daje i indeks Ulazak. Obje metode prihvaćaju a Zatvaranje kao argument.

U sljedećem primjeru ponavljamo svaku Ulazak. The Zatvaranje prešao u svaki() metoda dobiva par ključ / vrijednost iz implicitnog unosa parametra i ispisuje ga:

map.each {entry -> println "$ entry.key: $ entry.value"}

Dalje koristimo eachWithIndex () metoda za ispis trenutnog indeksa zajedno s ostalim vrijednostima:

map.eachWithIndex {entry, i -> println "$ i $ entry.key: $ entry.value"}

Također je moguće pitati ključ, vrijednost, i indeks se isporučuju odvojeno:

map.eachWithIndex {key, value, i -> println "$ i $ key: $ value"}

7. Filtriranje

Možemo koristiti find (), findAll () i grep () metode filtriranja i pretraživanja unosa na karti na temelju ključeva i vrijednosti.

Počnimo s definiranjem mape za izvršavanje ovih metoda na:

def map = [ime: "Jerry", dob: 42, grad: "New York", hobi: "Pjevanje"]

Prvo, pogledamo pronaći() metoda koja prihvaća a Zatvaranje a vraća prvu Ulazak koji odgovara Zatvaranje stanje:

assertTrue (map.find {it.value == "New York"}. key == "city")

Slično tome, pronađi sve također prihvaća a Zatvaranje ali vraća a Karta sa svim parovima ključ / vrijednost koji zadovoljavaju uvjet u Zatvaranje:

assertTrue (map.findAll {it.value == "New York"} == [grad: "New York"])

Ako bismo radije koristili Popis, iako možemo koristiti grep umjesto pronađi sve:

map.grep {it.value == "New York"}. svaki {it -> assertTrue (it.key == "city" && it.value == "New York")}

Prvo smo koristili grep da bismo pronašli unose koji imaju vrijednost kao New York. Zatim, za prikaz tipa povratka je Popis, ponavljamo kroz rezultat grep (). I za svaku Ulazak na popisu koji je dostupan u implicitnom parametru provjeravamo je li to očekivani rezultat.

Dalje, kako bismo saznali zadovoljavaju li svi predmeti na karti uvjet koji možemo koristiti svaki koji vraća a boolean.

Provjerimo jesu li sve vrijednosti na karti tipa Niz:

assertTrue (map.every {it -> it.value instanceof String} == false)

Slično tome, možemo koristiti bilo koji da biste utvrdili podudara li se bilo koji predmet na karti s uvjetom:

assertTrue (map.any {it -> it.value instanceof String} == true)

8. Transformacija i prikupljanje

Ponekad bismo možda htjeli pretvoriti unose na karti u nove vrijednosti. Koristiti prikupiti() i collectEntries () metode moguće je transformirati i prikupiti unose u Kolekcija ili Karta odnosno.

Pogledajmo neke primjere.

S obzirom na mapu ID-a zaposlenika i zaposlenika:

def map = [1: [ime: "Jerry", dob: 42, grad: "New York"], 2: [ime: "Long", dob: 25, grad: "New York"], 3: [ime : "Dustin", dob: 29, grad: "New York"], 4: [ime: "Dustin", dob: 34, grad: "New York"]]

Imena svih zaposlenika možemo prikupiti na popis pomoću prikupiti():

def names = map.collect {entry -> entry.value.name} assertTrue (names == ["Jerry", "Long", "Dustin", "Dustin"])

Dalje, ako nas zanima jedinstveni skup imena, možemo odrediti kolekciju dodavanjem Kolekcija objekt:

def uniqueNames = map.collect ([] kao HashSet) {entry -> entry.value.name} assertTrue (uniqueNames == ["Jerry", "Long", "Dustin"] kao Set)

Ako želimo promijeniti imena zaposlenika na karti iz malog u velika, možemo koristiti collectEntries. Ova metoda vraća mapu transformiranih vrijednosti:

def idNames = map.collectEntries {key, value -> [key, value.name]} assertTrue (idNames == [1: "Jerry", 2: "Long", 3: "Dustin", 4: "Dustin"] )

Posljednje, također je moguće koristiti prikupiti metode u vezi s pronaći i pronađi sve metode za pretvaranje filtriranih rezultata:

def below30Names = map.findAll {it.value.age value.name} assertTrue (below30Names == ["Long", "Dustin"])

Ovdje prvo pronađemo sve zaposlenike u dobi od 20 do 30 godina i prikupimo ih na kartu.

9. Grupiranje

Ponekad bismo možda htjeli grupirati neke stavke karte u podmape na temelju stanja.

The groupBy () metoda vraća mapu karata. I svaka karta sadrži parove ključ / vrijednost koji ocjenjuju isti rezultat za zadani uvjet:

def map = [1:20, 2: 40, 3: 11, 4: 93] def subMap = map.groupBy {it.value% 2} assertTrue (subMap == [0: [1:20, 2:40] , 1: [3:11, 4:93]])

Drugi način stvaranja potkarata je pomoću podkarta (). Drukčije je u groupBy () u smislu da dopušta samo grupiranje na temelju ključeva:

def keySubMap = map.subMap ([1,2]) assertTrue (keySubMap == [1:20, 2:40])

U tom se slučaju unosi za tipke 1 i 2 vraćaju na novoj karti, a svi ostali unosi odbacuju se.

10. Razvrstavanje

Obično prilikom razvrstavanja možda želimo razvrstati unose na karti na temelju ključa ili vrijednosti ili oboje. Groovy pruža a vrsta() metoda koja se može koristiti u tu svrhu.

Dana karta:

def map = [ab: 20, a: 40, cb: 11, ba: 93]

Ako je potrebno sortiranje po ključu, upotrijebite no-args vrsta() metoda koja se temelji na prirodnom redoslijedu:

def naturalOrderedMap = map.sort () assertTrue ([a: 40, ab: 20, ba: 93, cb: 11] == prirodnoUređena karta)

Ili upotrijebite razvrstaj (usporednik) metoda za pružanje logike usporedbe:

def compSortedMap = map.sort ({k1, k2 -> k1 k2} kao Usporednik) assertTrue ([a: 40, ab: 20, ba: 93, cb: 11] == compSortedMap)

Sljedeći, za sortiranje po ključu ili vrijednostima ili oboje, možemo dostaviti a Zatvaranje uvjet da vrsta():

def cloSortedMap = map.sort ({it1, it2 -> it1.value it1.value}) assertTrue ([cb: 11, ab: 20, a: 40, ba: 93] == cloSortedMap)

11. Zaključak

Počeli smo gledajući kako možemo stvarati Kartas u Groovyju. Zatim smo pogledali različite načine na koje se predmeti mogu dodavati, dohvaćati i uklanjati s karte.

Kasnije smo obradili metode izvođenja uobičajenih operacija koje se u Groovyju isporučuju odmah. Uključivale su filtriranje, pretraživanje, pretvaranje i sortiranje.

Kao i uvijek primjeri obuhvaćeni člankom mogu se naći na GitHubu.