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.