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.