Úvod do jazyka Groovy Language

1. Prehľad

Groovy je dynamický skriptovací jazyk pre JVM. Zostavuje sa do bajtkódu a bez problémov sa kombinuje s kódom Java a knižnicami.

V tomto článku sa pozrieme na základné funkcie programu Groovy vrátane základnej syntaxe, riadiacich štruktúr a kolekcií.

Potom sa pozrieme na niektoré z hlavných funkcií, ktoré z neho robia atraktívny jazyk, vrátane nulovej bezpečnosti, implicitnej pravdy, operátorov a reťazcov.

2. Životné prostredie

Ak chceme Groovy použiť v projektoch Maven, musíme do pom.xml:

  // ... org.codehaus.gmavenplus gmavenplus-plugin 1.5 // ... org.codehaus.groovy groovy-all 2.4.10 

Najnovší plugin Maven nájdete tu a najnovšiu verziu groovy-všetko tu.

3. Základné vlastnosti

Groovy obsahuje veľa užitočných funkcií. Teraz sa pozrime na základné stavebné prvky jazyka a na to, ako sa líši od Java.

Teraz sa pozrime na základné stavebné prvky jazyka a na to, ako sa líši od Java.

3.1. Dynamické písanie

Jednou z najdôležitejších vlastností aplikácie Groovy je podpora dynamického písania.

Definície typov sú voliteľné a skutočné typy sa určujú za behu programu. Pozrime sa na tieto dve triedy:

trieda Duck {String getName () {'Duck'}} trieda Cat {String getName () {'Cat'}} 

Tieto dve triedy definujú to isté getName metóda, ale v zmluve to nie je výslovne definované.

Teraz si predstavte, že máme zoznam objektov obsahujúcich kačice a mačky, ktoré majú getName metóda. S programom Groovy môžeme robiť nasledovné:

Duck duck = new Duck () Cat cat = new Cat () def list = [duck, cat] list.each {obj -> println obj.getName ()}

Kód sa skompiluje a výstup z vyššie uvedeného kódu bude:

Kačica mačka

3.2. Implicitná konverzia pravdy

Rovnako ako v JavaScripte, aj Groovy v prípade potreby vyhodnotí každý objekt na boolovskú hodnotu, napr. pri použití vo vnútri ak vyhlásenie alebo pri negovaní hodnoty:

if ("ahoj") {...} ak (15) {...} if (someObject) {...}

Pri tejto konverzii si musíte pamätať niekoľko jednoduchých pravidiel:

  • Neprázdny Zbierky, polia, mapy vyhodnotené do pravda
  • Matcher s najmenej jedným zápasom hodnotím ako pravda
  • Iterátory a Vyčíslenia s ďalšími prvkami sú vynútené pravda
  • Neprázdny Struny, GStruny a CharSequences, sú donútené pravda
  • Nenulové čísla sa hodnotia na pravda
  • Nenulové odkazy na objekty sú vynútené na pravda

Ak chceme prispôsobiť implicitnú konverziu pravdy, môžeme definovať našu akoBoolean () metóda.

3.3. Dovoz

Niektoré balíčky sa importujú predvolene a nemusíme ich importovať explicitne:

import java.lang. * import java.util. * import java.io. * import java.net. * import groovy.lang. * import groovy.util. * import java.math.BigInteger import java.math.BigDecimal

4. Transformácie AST

AST (Abstraktný strom syntaxe) transformácie nám umožňuje pripojiť sa k procesu kompilácie Groovy a prispôsobiť ho tak, aby vyhovoval našim potrebám. To sa deje v čase kompilácie, takže pri spustení aplikácie nedochádza k penalizácii výkonu. Môžeme vytvoriť naše transformácie AST, ale môžeme použiť aj tie zabudované.

Môžeme vytvoriť svoje transformácie alebo môžeme ťažiť z tých zabudovaných.

Pozrime sa na niekoľko anotácií, ktoré stojí za to vedieť.

4.1. Anotácia Typ skontrolovaný

Táto anotácia sa používa na vynútenie kompilátora, aby vykonal prísnu kontrolu typu pre anotované časti kódu. Mechanizmus kontroly typu je rozšíriteľný, takže na želanie môžeme dokonca zabezpečiť ešte prísnejšiu kontrolu typu, ako je k dispozícii v Jave.

Pozrime sa na príklad nižšie:

trieda Universe {@TypeChecked int answer () {"štyridsaťdva"}}

Ak sa pokúsime kompilovať tento kód, spozorujeme nasledujúcu chybu:

[Statická kontrola typu] - Nie je možné vrátiť hodnotu typu java.lang.String na metódu vracania typu int

The @TypeChecked na triedy a metódy je možné použiť anotáciu.

4.2. Anotácia CompileStatic

Táto anotácia umožňuje kompilátoru vykonávať kontroly v čase kompilácie, ako sa to deje s kódom Java. Potom kompilátor vykoná statickú kompiláciu, čím obíde protokol Groovy metaobject.

Keď je trieda anotovaná, všetky metódy, vlastnosti, súbory, vnútorné triedy atď. Anotovanej triedy budú skontrolované typom. Keď je metóda anotovaná, statická kompilácia sa použije iba na tie položky (uzávierky a anonymné vnútorné triedy), ktoré sú priložené touto metódou.

5. Vlastnosti

V aplikácii Groovy môžeme vytvárať POGO (Plain Old Groovy Objects), ktoré fungujú rovnako ako POJO v Jave, aj keď sú kompaktnejšie, pretože vyhľadávače a zakladatelia sa pre verejné nehnuteľnosti generujú automaticky počas kompilácie. Je dôležité mať na pamäti, že sa budú generovať, iba ak ešte nie sú definované.

To nám dáva flexibilitu pri definovaní atribútov ako otvorených polí pri zachovaní schopnosti prepísať správanie pri nastavovaní alebo získavaní hodnôt.

Zvážte tento objekt:

trieda Osoba {názov reťazca reťazec priezvisko}

Pretože predvolený rozsah pre triedy, polia a metódy je verejné - toto je verejná trieda a tieto dve polia sú verejné.

Kompilátor tieto prevedie do súkromných polí a pridá getName (), setName (), getLastName () a setLasfName () metódy. Ak definujeme stavač a getter pre konkrétne pole kompilátor nevytvorí verejnú metódu.

5.1. Skratky

Groovy ponúka skratku pre získanie a nastavenie vlastností. Namiesto jávskeho spôsobu volania geterov a nastavovačov môžeme použiť prístupovú notáciu podobnú poľu:

resourceGroup.getResourcePrototype (). getName () == SERVER_TYPE_NAME resourceGroup.resourcePrototype.name == SERVER_TYPE_NAME resourcePrototype.setName ("niečo") resourcePrototype.name = "niečo"

6. Prevádzkovatelia

Poďme sa teraz pozrieť na nové operátory pridané k tým, ktoré sú známe z obyčajnej Javy.

6.1. Nulová bezpečná dereferencia

Najpopulárnejším je operátor dereferencie bezpečný pre nulové hodnoty “?” čo nám umožňuje vyhnúť sa a NullPointerException pri volaní metódy alebo prístupe k vlastnosti a nulový objekt. Je to užitočné najmä pri reťazených hovoroch, kde a nulový hodnota sa môže vyskytnúť v určitom okamihu reťazca.

Môžeme napríklad bezpečne volať:

Názov reťazca = osoba? .Organizácia?. Rodič?. Meno

Vo vyššie uvedenom príklade, ak a osoba, osoba.organizáciaalebo organizácia.rodič nulovýpotom nulový sa vracia.

6.2. Prevádzkovateľ Elvis

Prevádzkovateľ Elvis “?:”Dovoľte nám zhustiť ternárne výrazy. Tieto dva sú ekvivalentné:

Názov reťazca = osoba.názov?: Predvolené meno

a

Názov reťazca = osoba.nazov? person.name: defaultName

Priraďujú obaja hodnotu meno osoby do premennej názvu, ak je Groovy pravda (v tomto prípade nie nulový a má nenulová dĺžka).

6.3. Prevádzkovateľ vesmírnej lode

Prevádzkovateľ vesmírnej lode “” je relačný operátor, ktorý funguje ako Java porovnať s() ktorý porovnáva dva objekty a vracia -1, 0 alebo +1 v závislosti od hodnôt oboch argumentov.

Ak je ľavý argument väčší ako pravý, operátor vráti 1. Ak je ľavý argument menší ako pravý, vráti operátor −1. Ak sú argumenty rovnaké, vráti sa 0.

Najväčšou výhodou použitia porovnávacích operátorov je plynulé spracovanie nuly také, že x r nikdy nebude hádzať a NullPointerException:

println 5 null

Výsledkom bude vyššie uvedený príklad 1.

7. Struny

Existuje niekoľko spôsobov vyjadrenia reťazcových literálov. Prístup používaný v prostredí Java (reťazce s dvojitými úvodzovkami) je podporovaný, ale je povolené tiež používať jednoduché úvodzovky, ak sú preferované.

Podporované sú aj viacriadkové reťazce, ktoré sa niekedy v iných jazykoch nazývajú heredocs, a to pomocou trojitých úvodzoviek (jednoduchých alebo dvojitých).

Podporované sú aj viacriadkové reťazce, ktoré sa niekedy v iných jazykoch nazývajú heredocs, a to pomocou trojitých úvodzoviek (jednoduchých alebo dvojitých).

Reťazce definované v úvodzovkách podporujú interpoláciu pomocou ${} syntax:

def name = "Bill Gates" def pozdrav = "Dobrý deň, $ {name}"

V skutočnosti môže byť akýkoľvek výraz umiestnený vo vnútri ${}:

def name = "Bill Gates" def pozdrav = "Dobrý deň, $ {name.toUpperCase ()}"

Reťazec s dvojitými úvodzovkami sa nazýva GString, ak obsahuje výraz ${}, inak je to rovina String objekt.

Nasledujúci kód sa spustí bez zlyhania testu:

def a = "ahoj" tvrdiť a.class.name == 'java.lang.String' def b = 'ahoj' tvrdiť b.class.name == 'java.lang.String' def c = "$ {b} "tvrdiť c.class.name == 'org.codehaus.groovy.runtime.GStringImpl'

8. Zbierky a mapy

Poďme sa pozrieť na to, ako sa zaobchádza s niektorými základnými dátovými štruktúrami.

8.1. Zoznamy

Tu je kód, ktorý umožňuje pridať niekoľko prvkov do novej inštancie ArrayList v Jave:

Zoznam zoznam = nový ArrayList (); list.add („ahoj“); list.add ("svet");

A tu je rovnaká operácia v Groovy:

Zoznam zoznamu = ['Hello', 'World']

Zoznamy sú predvolene typu java.util.ArrayList a možno ich tiež výslovne deklarovať volaním príslušného konštruktora.

Pre a neexistuje samostatná syntax Nastaviť, ale môžeme použiť typ nátlak pre to. Buď použite:

Nastaviť pozdrav = ['Hello', 'World']

alebo:

def greeting = ['Hello', 'World'] as Set

8.2. Mapa

Syntax pre a Mapa je podobný, aj keď trochu podrobnejší, pretože musíme vedieť určiť kľúče a hodnoty ohraničené dvojbodkami:

def key = 'Key3' def aMap = ['Key1': 'Hodnota 1', Key2: 'Hodnota 2', (key): 'Ďalšia hodnota']

Po tejto inicializácii dostaneme nový LinkedHashMap s údajmi: Kľúč1 -> Hodnota1, Kľúč2 -> Hodnota 2, Kľúč3 -> Ďalšia hodnota.

K položkám na mape môžeme pristupovať mnohými spôsobmi:

println aMap ['Key1'] println aMap [key] println aMap.Key1

9. Kontrolné štruktúry

9.1. Podmienky: keby-inak

Groovy podporuje podmienené ako / inak syntax podľa očakávania:

if (...) {// ...} else if (...) {// ...} else {// ...} 

9.2. Podmienky: rozvodňa

The prepínač vyhlásenie je spätne kompatibilné s kódom Java, aby sme mohli prepadnúť prípadom zdieľajúcim rovnaký kód pre viac zhôd.

Najdôležitejší rozdiel je v tom, že a prepínač môže vykonávať porovnávanie s viacerými rôznymi typmi hodnôt:

def x = 1,23 def result = "" switch (x) {case "foo": result = "found foo" break case "bar": result + = "bar" case break [4, 5, 6, 'inList'] : result = "list" break case 12..30: result = "range" break case Number: result = "number" break case ~ / fo * /: result = "foo regex" break case {it <0}: / / alebo {x <0} result = "negative" break default: result = "default"} println (výsledok)

Vyššie uvedený príklad sa vytlačí číslo.

9.3. Slučky: zatiaľ čo

Groovy podporuje obvyklé zatiaľ čo slučky ako Java robí:

def x = 0 def y = 5 while (y--> 0) {x ++}

9.4. Slučky: pre

Groovy túto jednoduchosť prijíma a dôrazne podporuje pre slučky podľa tejto štruktúry:

pre (premenná v iterovateľnej) {body}

The pre slučka sa iteruje iterovateľný. Často používanými iteračnými súbormi sú rozsahy, zbierky, mapy, polia, iterátory a výčty. V skutočnosti môže byť každý objekt iterovateľnou.

Ortézy okolo tela sú voliteľné, ak pozostávajú iba z jedného výroku. Nižšie uvádzame príklady iterácie po a rozsah, zoznam, pole, mapaa struny:

def x = 0 pre (i v 0..9) {x + = i} x = 0 pre (i v [0, 1, 2, 3, 4]) {x + = i} def pole = (0. .4) .toArray () x = 0 pre (i v poli) {x + = i} def map = ['abc': 1, 'def': 2, 'xyz': 3] x = 0 pre (e v mape) {x + = e.value} x = 0 pre (v v map.values ​​()) {x + = v} def text = "abc" def list = [] pre (c v texte) {zoznam. pridať (c)}

Vďaka iterácii objektov je Groovy pre-slučka sofistikovaná štruktúra riadenia. Je platným náprotivkom k použitiu metód, ktoré iterujú nad objektom s uzávermi, ako je napríklad použitie Zbierka je každá metóda.

Hlavný rozdiel je v tom, že telo a pre slučka nie je uzáver, to znamená, že toto telo je blok:

pre (x na 0..9) {println x}

keďže tento orgán je uzavretý:

(0..9) .each {println it}

Aj keď vyzerajú podobne, svojou konštrukciou sa veľmi líšia.

Uzáver je vlastný objekt a má rôzne vlastnosti. Môže byť skonštruovaný na inom mieste a odovzdaný do každý metóda. Telo však pre-slučka je priamo generovaná ako bytecode v mieste vzhľadu. Neplatia žiadne špeciálne pravidlá určovania rozsahu.

10. Spracovanie výnimiek

Veľký rozdiel je v tom, že sa nevykonáva kontrola kontrolovaných výnimiek.

Aby sme zvládli všeobecné výnimky, môžeme umiestniť kód potenciálne spôsobujúci výnimky do a Skús chytiť blok:

skúste {someActionThatWillThrowAnException ()} catch (e) // prihlásiť chybové hlásenie a / alebo nejako zaobchádzať}

Nevyhlásením typu výnimky, ktorú chytíme, sa tu zachytí akákoľvek výnimka.

11. Uzávery

Jednoducho povedané, uzávierka je anonymný blok spustiteľného kódu, ktorý je možné odovzdať premenným a má prístup k údajom v kontexte, v ktorom bol definovaný.

Podobajú sa tiež na anonymné vnútorné triedy, hoci neimplementujú rozhranie ani nerozširujú základnú triedu. Sú podobné lambdám v Jave.

Je zaujímavé, že Groovy môže naplno využiť výhody doplnkov JDK, ktoré boli zavedené na podporu lambdas, najmä streamovacieho API. Uzávery môžeme vždy použiť tam, kde sa očakávajú výrazy lambda.

Uvažujme nižšie uvedený príklad:

def helloWorld = {println "Hello World"}

Premenná ahoj svet teraz obsahuje odkaz na uzávierku a môžeme ju vykonať zavolaním jej hovor metóda:

helloWorld.call ()

Groovy nám umožňuje použiť prirodzenejšiu syntax volania metódy - vyvolá sa hovor metóda pre nás:

ahoj svet ()

11.1. Parametre

Podobne ako metódy, aj uzávery môžu mať parametre. Existujú tri varianty.

V druhom príklade je k dispozícii iba jeden parameter s predvoleným názvom, pretože tu nie je nič declpersistence_startared to. Upravená uzávierka, ktorá vytlačí to, čo sa odošle, bude:

def printTheParam = {println it}

Mohli by sme to nazvať takto:

printTheParam („ahoj“) printTheParam „ahoj“

Môžeme tiež očakávať parametre v uzáverách a odovzdať ich pri volaní:

def power = {int x, int y -> return Math.pow (x, y)} println power (2, 3)

Definícia typov parametrov je rovnaká ako v prípade premenných. Ak definujeme typ, môžeme použiť iba tento typ, ale môžeme ho tiež a odovzdať všetko, čo chceme:

def say = {what -> println what} povedať "Hello World"

11.2. Voliteľný návrat

Posledný príkaz o ukončení môže byť implicitne vrátený bez potreby písania príkazu na vrátenie. To sa môže použiť na zníženie štandardného kódu na minimum. Uzáveru, ktorá počíta druhú mocninu čísla, je možné skrátiť takto:

def square = {it * it} println square (4)

Toto uzavretie umožňuje použitie implicitného parametra to a voliteľný výkaz o vrátení tovaru.

12. Záver

Tento článok priniesol rýchly úvod do jazyka Groovy a jeho kľúčových funkcií. Začali sme zavedením jednoduchých konceptov, ako sú základná syntax, podmienené príkazy a operátory. Predviedli sme tiež niektoré pokročilejšie funkcie, ako sú operátory a uzávery.

Ak chcete nájsť viac informácií o tomto jazyku a jeho sémantike, môžete prejsť priamo na oficiálnu stránku.


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