Nové funkcie v prostredí Java 8
1. Prehľad
V tomto článku sa pozrieme na zopár najzaujímavejších nových funkcií v prostredí Java 8.
Budeme hovoriť o: predvolených a statických metódach rozhrania, referenciách metód a voliteľnom.
Už sme sa zaoberali niektorými funkciami vydania Java 8 - stream API, výrazmi lambda a funkčnými rozhraniami - pretože sú to komplexné témy, ktoré si zaslúžia samostatný vzhľad.
2. Predvolené a statické metódy rozhrania
Pred jazykom Java 8 mohli mať rozhrania iba verejné abstraktné metódy. Nebolo možné pridať nové funkcie k existujúcemu rozhraniu bez toho, aby boli všetky implementačné triedy nútené vytvoriť implementáciu nových metód, ani nebolo možné vytvoriť metódy rozhrania s implementáciou.
Počnúc jazykom Java 8 môžu mať rozhrania statický a predvolené metódy, ktoré napriek tomu, že sú deklarované v rozhraní, majú definované správanie.
2.1. Statická metóda
Zvážte nasledujúcu metódu rozhrania (nazvime ju toto rozhranie Vozidlo):
static String producer () {návrat "N&F Vehicles"; }
Statická producent () Táto metóda je k dispozícii iba cez rozhranie. Nemôže to prepísať implementujúca trieda.
Na jeho volanie mimo rozhrania by sa mal použiť štandardný prístup pre volanie statickej metódy:
Výrobca reťazcov = Vehicle.producer ();
2.2. Predvolená metóda
Predvolené metódy sa deklarujú pomocou nového predvolené kľúčové slovo. Sú prístupné prostredníctvom inštancie implementujúcej triedy a je možné ich prepísať.
Pridajme a predvolené metóda k našej Vozidlo rozhranie, ktoré tiež uskutoční hovor na server statický metóda tohto rozhrania:
default String getOverview () {return "ATV made by" + producer (); }
Predpokladajme, že toto rozhranie je implementované triedou VehicleImpl. Za vykonanie predvolené metóda by mala byť vytvorená inštancia tejto triedy:
Vozidlo vozidlo = new VehicleImpl (); Prehľad reťazcov = vehicle.getOverview ();
3. Odkazy na metódy
Odkaz na metódu je možné použiť ako kratšiu a čitateľnejšiu alternatívu pre výraz lambda, ktorý volá iba existujúcu metódu. Existujú štyri varianty odkazov na metódy.
3.1. Odkaz na statickú metódu
Odkaz na statickú metódu obsahuje nasledujúcu syntax: ContainingClass :: methodName.
Skúsme spočítať všetky prázdne reťazce v Zoznam pomocou Stream API.
boolean isReal = list.stream (). anyMatch (u -> User.isRealUser (u));
Zoznámte sa bližšie s výrazom lambda v anyMatch () metóda, iba zavolá statickú metódu isRealUser (užívateľ užívateľa) z Používateľ trieda. Môže byť nahradený odkazom na statickú metódu:
boolean isReal = list.stream (). anyMatch (User :: isRealUser);
Tento typ kódu vyzerá oveľa informatívnejšie.
3.2. Odkaz na inštančnú metódu
Odkaz na inštančnú metódu má nasledujúcu syntax: containingInstance :: methodName. Nasledujúca metóda volania kódu isLegalName (reťazec) typu Používateľ ktorý overuje vstupný parameter:
User user = new User (); boolean isLegalName = list.stream (). anyMatch (user :: isLegalName);
3.3. Odkaz na inštančnú metódu objektu konkrétneho typu
Táto referenčná metóda má nasledujúcu syntax: C.ontainingType :: methodName. Príklad::
long count = list.stream (). filter (String :: isEmpty) .count ();
3.4. Odkaz na konštruktéra
Odkaz na konštruktor má nasledujúcu syntax: Názov triedy::Nový. Pretože konštruktor v Jave je špeciálna metóda, bolo možné na ňu pomocou metódy použiť aj odkaz na metódu Novýako názov metódy.
Stream stream = list.stream (). Mapa (Používateľ :: nový);
4. Voliteľné
Predtým, ako vývojári Java 8 museli starostlivo overiť hodnoty, na ktoré odkazovali, kvôli možnosti hodu na server NullPointerException (NPE). Všetky tieto kontroly si vyžadovali dosť nepríjemný a na chyby náchylný štandardný kód.
Java 8 Voliteľné trieda môže pomôcť zvládnuť situácie, keď existuje možnosť získať NPE. Funguje ako kontajner pre objekt typu T. Môže vrátiť hodnotu tohto objektu, ak nie je a nulový. Keď je hodnota vo vnútri tohto kontajnera nulový umožňuje namiesto hádzania robiť niektoré preddefinované akcie NPE.
4.1. Vytvorenie Voliteľné
Príklad inštancie Voliteľné triedu je možné vytvoriť pomocou jej statických metód:
Voliteľné voliteľné = Optional.empty ();
Vráti prázdne miesto Voliteľné.
Reťazec str = "hodnota"; Voliteľné voliteľné = Optional.of (str);
Vráti Voliteľné ktorý obsahuje nenulovú hodnotu.
Voliteľné voliteľné = Voliteľné.ofNullable (getString ());
Vráti Voliteľné s konkrétnou hodnotou alebo prázdny Voliteľné ak je parameter nulový.
4.2. Voliteľné použitie
Napríklad očakávate, že získate a Zoznam a v prípade nulový chcete ho nahradiť novou inštanciou súboru ArrayList. ŽS kódom pred Java 8 musíte urobiť niečo také:
Zoznam zoznam = getList (); Zoznam listOpt = zoznam! = Null? zoznam: new ArrayList ();
S Java 8 je možné dosiahnuť rovnakú funkcionalitu s oveľa kratším kódom:
Zoznam listOpt = getList (). OrElseGet (() -> nový ArrayList ());
Existuje ešte viac štandardných kódov, keď potrebujete dosiahnuť pole niektorého objektu starým spôsobom. Predpokladajme, že máte objekt typu Používateľ ktorý má pole typu Adresa s poľom skoruna typu String. A z nejakého dôvodu musíte vrátiť hodnotu ulica pole, ak nejaké existujú, alebo predvolená hodnota, ak ulica je nulový:
Užívateľ užívateľ = getUser (); if (user! = null) {Address address = user.getAddress (); if (address! = null) {String street = address.getStreet (); if (ulica! = null) {spiatočná ulica; }}} vrátiť "neuvedené";
To sa dá zjednodušiť pomocou Voliteľné:
Voliteľný používateľ = Optional.ofNullable (getUser ()); Výsledok reťazca = user .map (User :: getAddress) .map (Address :: getStreet) .orElse ("neuvedené");
V tomto príklade sme použili mapa () metóda prevodu výsledkov volania getAdress () do Voliteľné a getStreet () do Voliteľné. Ak sa niektorá z týchto metód vrátila nulový the mapa () metóda vráti prázdny Voliteľné.
Predstavte si, že sa naši geteri vracajú Voliteľné. Mali by sme teda použiť flatMap () metóda namiesto mapa ():
Voliteľné optionalUser = Optional.ofNullable (getOptionalUser ()); Výsledok reťazca = optionalUser .flatMap (OptionalUser :: getAddress) .flatMap (OptionalAddress :: getStreet) .orElse ("neuvedené");
Ďalší prípad použitia Voliteľné sa mení NPE s inou výnimkou. Takže, ako sme to už robili predtým, skúsme to urobiť v štýle pred Java 8:
Hodnota reťazca = null; Výsledok reťazca = ""; try {result = value.toUpperCase (); } catch (NullPointerException výnimka) {hodiť novú CustomException (); }
A čo keď použijeme Voliteľné? Odpoveď je čitateľnejšia a jednoduchšia:
Hodnota reťazca = null; Voliteľná hodnotaOpt = Voliteľná.ofNullable (hodnota); Výsledok reťazca = valueOpt.orElseThrow (CustomException :: new) .toUpperCase ();
Všimnite si, že ako a na aký účel sa majú používať Voliteľné vo vašej aplikácii je vážne a kontroverzné rozhodnutie o dizajne a vysvetlenie všetkých jeho výhod a nevýhod je mimo rozsahu tohto článku. Ak vás zaujíma, môžete siahnuť hlbšie, na internete je veľa zaujímavých článkov venovaných tomuto problému. Tento a tento ďalší môžu byť veľmi užitočné.
5. Záver
V tomto článku stručne diskutujeme o niekoľkých zaujímavých nových funkciách v prostredí Java 8.
Existuje samozrejme mnoho ďalších doplnkov a vylepšení, ktoré sú rozšírené v mnohých balíkoch a triedach Java 8 JDK.
Informácie zobrazené v tomto článku sú však dobrým východiskovým bodom pre skúmanie a spoznávanie niektorých z týchto nových funkcií.
Nakoniec je všetok zdrojový kód článku k dispozícii na GitHub.