Typy strún v Groovy

1. Prehľad

V tomto tutoriáli sa bližšie pozrieme na niekoľko typov reťazcov v Groovy, vrátane jednoduchých, dvojitých, trojitých a bláznivých reťazcov.

Preskúmame tiež podporu reťazcov Groovy pre špeciálne znaky, viacriadkový, regulárny výraz, únikové znaky a variabilnú interpoláciu.

2. Posilnenie java.lang.String

Asi je dobré začať konštatovaním, že keďže Groovy je založený na Jave, obsahuje všetky Javy String vďaka tomu možnosti ako zreťazenie, String API a inherentné výhody spoločného fondu String.

Najprv sa pozrime, ako Groovy rozširuje niektoré z týchto základných informácií.

2.1. Zreťazenie reťazca

Zreťazenie reťazcov je iba kombináciou dvoch reťazcov:

def first = 'first' def second = "second" def zreťazenie = prvý + druhý assertEquals ('firstsecond', zreťazenie)

Na tom Groovy stavia pomocou niekoľkých ďalších typov reťazcov, ktorým sa za chvíľu pozrieme. Upozorňujeme, že každý typ môžeme vzájomne zreťaziť.

2.2. Reťazcová interpolácia

Teraz Java ponúka niekoľko veľmi základných šablón printf, ale Groovy ide hlbšie, ponúka interpolácia strún, proces šablónovania reťazcov s premennými:

def name = "Kacper" def result = "Dobrý deň, $ {name}!" assertEquals ("Ahoj Kacper!", result.toString ())

Zatiaľ čo Groovy podporuje zreťazenie pre všetky typy reťazcov, poskytuje interpoláciu iba pre určité typy.

2.3. GString

V tomto príklade sa ale skrýva malá vráska - prečo voláme natiahnuť()?

Vlastne, výsledok nie je typu String, aj keď to tak vyzerá.

Pretože String trieda je konečné, Trieda reťazcov Groovy, ktorá podporuje interpoláciu, GString, nepodtriedi to. Inými slovami, aby spoločnosť Groovy poskytla toto vylepšenie, má svoju vlastnú triedu reťazcov, GString, ktoré sa nemôžu predĺžiť z String.

Jednoducho povedané, keby sme to urobili:

assertEquals (výsledok „Ahoj Kacper!“)

toto vyvoláva assertEquals (Object, Object), a dostaneme:

java.lang.AssertionError: očakáva sa: java.lang.String, ale bol: org.codehaus.groovy.runtime.GStringImpl Očakávané: java.lang.String skutočná: org.codehaus.groovy.runtime.GStringImpl

3. Jeden citovaný reťazec

Pravdepodobne najjednoduchší reťazec v Groovy je reťazec s jednoduchými úvodzovkami:

def example = 'Ahoj svet'

Pod kapotou sú to iba obyčajné staré Java Struny, a prídu vhod keď potrebujeme mať vnútri nášho reťazca úvodzovky.

Namiesto:

def hardToRead = "Kacper miluje \" Pána prsteňov \ ""

Jeden reťazec môžeme ľahko zreťaziť s druhým:

def easyToRead = 'Kacper miluje "Pána prsteňov"'

Pretože môžeme takto vymeniť typy ponúk, znižuje sa to potreba úniku z ponúk.

4. Trojitý reťazec s jednou citáciou

V kontexte definovania viacriadkového obsahu je užitočný trojitý reťazec s jednou úvodzovkou.

Napríklad povedzme, že nejaké máme JSON reprezentovať ako reťazec:

{"name": "John", "age": 20, "birthDate": null}

Na to, aby sme to reprezentovali, sa nemusíme uchýliť k zreťazeniu a explicitným znakom nového riadku.

Namiesto toho použijeme trojitý reťazec s jednou úvodzovkou:

def jsonContent = '' '{"name": "John", "age": 20, "birthDate": null}' ''

Groovy to ukladá ako jednoduchú Javu Stringa dodáva pre nás potrebné zreťazenie a nové riadky.

Existuje však ešte jedna výzva na prekonanie.

Pre čitateľnosť kódu typicky odsadíme náš kód:

def triple = '' 'prvý riadok druhý riadok' ''

ale trojité reťazce s jednoduchou citáciou zachovávajú medzery. To znamená, že vyššie uvedený reťazec je skutočne:

(nový riadok) prvý riadok (nový riadok) druhý riadok (nový riadok)

nie:

1 2 prvý riadok (nový riadok)druhý riadok (nový riadok)

ako sme možno zamýšľali.

Zostaňte naladení a uvidíte, ako sa ich zbavíme.

4.1. Znak nového riadku

Potvrdíme to náš predchádzajúci reťazec začína znakom nového riadku:

assertTrue (triple.startsWith ("\ n"))

Je možné túto postavu vyzliecť. Aby sme tomu zabránili, musíme dať jedno spätné lomítko \ ako prvý a posledný znak:

def triple = '' \ \ prvý riadok druhý riadok '' '

Teraz máme aspoň:

1 2 prvý riadok (nový riadok)druhý riadok (nový riadok)

Jeden problém dole, ďalší do konca.

4.2. Odstráňte odsadenie kódu

Ďalej sa postaráme o odsadenie. Chceme zachovať naše formátovanie, ale odstrániť zbytočné medzery.

Na pomoc prichádza Groovy String API!

Na odstránenie úvodných medzier v každom riadku nášho reťazca môžeme použiť jednu z predvolených metód Groovy, Reťazec # stripIndent ():

def triple = '' '\ firstline secondline' ''. stripIndent () assertEquals ("firstline \ nsecondline", triple)

Upozorňujeme, že posunutím kliešťov o riadok vyššie odstránili sme tiež koncový znak nového riadku.

4.3. Relatívne odsadenie

Mali by sme si to pamätať stripIndent nie je volaný stripWhitespace.

stripIndent určuje veľkosť odsadenia od skráteného riadku bez medzier v reťazci.

Poďme teda trochu zmeniť odsadenie pre naše trojnásobný premenná:

class TripleSingleQuotedString {@Test void 'triple single quotes with multiline string with last line with only whitespaces' () {def triple = '' '\ firstline secondline \' '' .stripIndent () // ... use triple}}

Tlač trojnásobný by nám ukázal:

prvý riadok druhý riadok

Odkedy prvá línia je najmenej odsadená ne-medzera, stane sa nulou odsadenou druhý riadok stále odsadené vzhľadom na to.

Všimnite si tiež, že tentokrát odstraňujeme koncové biele medzery lomítkom, ako sme to videli už skôr.

4.4. Odizolujte stripMargin ()

Pre ešte väčšiu kontrolu môžeme Groovy presne určiť, kde má začať riadok, pomocou | | a stripMargin:

def triple = '' \ | prvý riadok | druhý riadok '' '. stripMargin ()

Ktoré by zobrazovali:

prvý riadok druhý riadok

Fajka uvádza, kde sa tento riadok reťazca skutočne začína.

Tiež môžeme zložiť a Postava alebo CharSequence ako argument pre stripMargin s našim vlastným znakom oddeľovača.

Skvelé, zbavili sme sa všetkých nepotrebných prázdnych miest a náš reťazec obsahuje iba to, čo chceme!

4.5. Unikajúce špeciálne znaky

So všetkými pozitívami trojitého reťazca s jednoduchými úvodzovkami je prirodzeným dôsledkom nutnosti uniknúť jednoduchým úvodzovkám a spätným lomkám, ktoré sú súčasťou nášho reťazca.

Aby sme predstavovali špeciálne znaky, musíme im tiež uniknúť so spätnou lomkou. Najbežnejšie špeciálne znaky sú nový riadok (\ n) a tabuľka (\ t).

Napríklad:

def specialCharacters = '' 'ahoj \' John \ '. Toto je spätné lomítko - \ \ nDruhý riadok začína tu '' '

bude mať za následok:

ahoj 'John'. Toto je spätné lomítko - \ Druhý riadok sa začína tu

Existuje niekoľko vecí, ktoré si musíme pamätať, a to:

  • \ t - tabuľkové spracovanie
  • \ n - Nový riadok
  • \ b - backspace
  • \ r - návrat vozíka
  • \\ - spätné lomítko
  • \ f - formfeed
  • \' - jednoduchá citácia

5. Reťazec s dvoma úvodzovkami

Zatiaľ čo reťazce s dvojitými úvodzovkami sú tiež iba Java Struny, ich špeciálnou silou je interpolácia. Keď reťazec s dvoma úvodzovkami obsahuje znaky interpolácie, Groovy vypne Javu String pre GString.

5.1.GString a Lazy Evaluation

Môžeme interpolovať reťazec s dvoma úvodzovkami tak, že obklopíme výrazy ${} alebo s $ pre bodkované výrazy.

Jeho hodnotenie je lenivé, hoci - nebude prevedený na a String kým sa neprenesie na metódu, ktorá vyžaduje a String:

def string = "example" def stringWithExpression = "example $ {2}" assertTrue (string instanceof String) assertTrue (stringWithExpression instanceof GString) assertTrue (stringWithExpression.toString () instanceof String)

5.2. Zástupný symbol s odkazom na premennú

Prvá vec, ktorú pravdepodobne chceme urobiť s interpoláciou, je poslať jej odkaz na premennú:

def name = "John" def helloName = "Ahoj $ meno!" assertEquals ("Hello John!", helloName.toString ())

5.2. Zástupný symbol s výrazom

Môžeme mu však dať aj výrazy:

def result = "result is $ {2 * 2}" assertEquals ("result is 4", result.toString ())

Môžeme vložiť rovnomerné vyhlásenia na zástupné symboly, ale považuje sa to za zlý postup.

5.3. Zástupné symboly u operátora Dot

V našich reťazcoch môžeme dokonca prechádzať hierarchiami objektov:

def person = [meno: 'John'] def myNameIs = "Som $ person.name a ty?" assertEquals ("Ja som John a ty?", myNameIs.toString ())

U getrov môže Groovy zvyčajne odvodiť názov vlastnosti.

Ak však zavoláme metódu priamo, budeme ju musieť použiť ${}kvôli zátvorkám:

def name = 'John' def result = "Veľké meno: $ {name.toUpperCase ()}". toString () assertEquals ("Veľké meno: JOHN", výsledok)

5.4. hashCode v GString a String

Interpolované reťazce sú v porovnaní s obyčajnými určite bohovskými darmi java.util.String, ale líšia sa dôležitým spôsobom.

Pozri, Java Struny sú nemenné, a tak volajú hashCode na danom reťazci vráti vždy rovnakú hodnotu.

Ale, GString kódy hash sa môžu líšiť od String reprezentácia závisí od interpolovaných hodnôt.

A v skutočnosti ani pre ten istý výsledný reťazec nebudú mať rovnaké hash kódy:

def string = "2 + 2 je 4" def gstring = "2 + 2 je $ {4}" assertTrue (string.hashCode ()! = gstring.hashCode ())

Preto by sme ich nikdy nemali používať GString ako kľúč v a Mapa!

6. Trojitý reťazec dvojitých uvozoviek

Videli sme teda trojité reťazce s jednou úvodzovkou a dva reťazce s úvodzovkami.

Spojme silu oboch, aby sme získali to najlepšie z oboch svetov - viacriadková interpolácia reťazcov:

def name = "John" def multiLine = "" "Som $ name." Toto je citát z filmu "Vojna a mier" "" ""

Všimnite si to tiež nemuseli sme uniknúť jednoduchým ani dvojitým úvodzovkám!

7. Slashy String

Povedzme teraz, že robíme niečo s regulárnym výrazom, a tak všade unikáme spätným lomítkam:

def pattern = "\ d {1,3} \ s \ w + \ s \ w + \\ w +"

Je to jednoznačne neporiadok.

Aby sme tomu pomohli, Groovy podporuje regex natívne pomocou slashy strún:

def pattern = / \ d {3} \ s \ w + \ s \ w + \ w + / assertTrue ("3 slepé myši \ muži" .zhody (vzor))

Slashy struny môžu byť interpolované aj viacriadkové:

def name = 'John' def example = / Drahá ([A-Z] +), láska, $ meno /

Samozrejme, musíme uniknúť lomítka:

def vzor = /.*foobar.*\/hello.*/ 

A nemôžeme reprezentovať prázdny reťazec pomocou Slashy Stringkeďže kompilátor rozumie // ako komentár:

// if ('' == //) {// println ("Nemôžem kompilovať") //}

8. Dollar-Slashy String

Slashy struny sú skvelé, aj keď je nepríjemné musieť uniknúť z lomítka. Aby sme sa vyhli ďalšiemu úniku lomky, môžeme použiť reťazec dolárovaný.

Predpokladajme, že máme vzor regulárneho výrazu: [0-3]+/[0-3]+. Je to dobrý kandidát na reťazec, ktorý je dolár bláznivý, pretože do reťazca s blázonmi by sme museli napísať: [0-3]+//[0-3]+.

Dollar-slashy reťazce sú viacriadkové GStrings, ktoré sa otvárajú pomocou $ / a zatvárajú pomocou / $. Aby sme unikli doláru alebo lomku, môžeme mu predchádzať znak dolára ($), ale nie je to potrebné.

Nepotrebujeme uniknúť $ in GString zástupný symbol.

Napríklad:

def name = "John" def dollarSlashy = $ / Dobrý deň, $ name !, môžem vám ukázať znak $ alebo znak dolára s uniknutými znakmi: $$ Obidve lomítka fungujú: \ alebo /, ale stále im môžeme uniknúť: $ / Máme uniknúť oddeľovačom otvárania a zatvárania: - $$$ / - $ / $$ / $ 

by výstup:

Ahoj John !, Môžem ti ukázať znak $ alebo znak dolára s únikom: $ Obe lomítka fungujú: \ alebo /, ale stále im môžeme uniknúť: / Musíme uniknúť oddeľovaču otvárania a zatvárania: - $ / - / $

9. Postava

Tí, čo poznajú Javu, sa už čudovali, čo Groovy urobil s postavami, pretože pre reťazce používa jednoduché úvodzovky.

Vlastne, Groovy nemá explicitný znakový literál.

Existujú tromi spôsobmi urobiť a Groovy reťazec skutočný znak:

  • výslovné použitie kľúčového slova „char“ pri deklarovaní premennej
  • pomocou operátora „ako“
  • odliatím do „char“

Pozrime sa na všetky:

char a = 'A' char b = 'B' ako char char c = (char) 'C' assertTrue (instanceof Character) assertTrue (b instanceof Character) assertTrue (c instanceof Character)

Prvý spôsob je veľmi vhodný, keď si chceme ponechať znak ako premennú. Ďalšie dve metódy sú zaujímavejšie, keď chceme funkcii postúpiť znak ako argument.

10. Zhrnutie

Je zrejmé, že to bolo veľa, takže si rýchlo zhrňme niektoré kľúčové body:

  • reťazce vytvorené s jednoduchou úvodzovkou (‘) nepodporujú interpoláciu
  • slashy a strojnásobené dvojité úvodzovky môžu byť viacriadkové
  • viacriadkové reťazce obsahujú medzery z dôvodu odsadenia kódu
  • spätné lomítko (\) sa používa na únik zo špeciálnych znakov v každom type, okrem reťazca dolárového reťazca, kde na únik musíme použiť dolár ($)

11. Záver

V tomto článku sme diskutovali o mnohých spôsoboch vytvorenia reťazca v Groovy a jeho podpory pre viacriadkové linky, interpoláciu a regex.

Všetky tieto úryvky sú k dispozícii na stránkach Github.

A ak chcete získať viac informácií o vlastnostiach samotného jazyka Groovy, začnite dobre úvodom do sveta Groovy.


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