Nove značajke u Javi 8

1. Pregled

U ovom ćemo članku na brzinu pogledati neke od najzanimljivijih novih značajki Java 8.

Razgovarat ćemo o: zadanim i statičkim metodama sučelja, referencama metoda i Neobveznim.

Već smo obradili neke značajke izdanja Java 8 - stream API, lambda izraze i funkcionalna sučelja - jer su to sveobuhvatne teme koje zaslužuju zaseban pogled.

2. Zadane i statičke metode sučelja

Prije Jave 8, sučelja su mogla imati samo javne apstraktne metode. Nije bilo moguće dodati novu funkcionalnost postojećem sučelju bez prisiljavanja svih izvedbenih klasa da kreiraju implementaciju novih metoda, niti je bilo moguće stvoriti metode sučelja s implementacijom.

Počevši od Jave 8, sučelja mogu imati statički i zadano metode koje, unatoč deklariranju u sučelju, imaju definirano ponašanje.

2.1. Statička metoda

Razmotrite sljedeću metodu sučelja (nazovimo ovo sučelje Vozilo):

proizvođač statičnih nizova () {return "N&F Vehicles"; }

Statički proizvođač() metoda je dostupna samo kroz i unutar sučelja. Ne može ga nadjačati izvedbena klasa.

Da biste ga pozvali izvan sučelja, trebao bi se koristiti standardni pristup za poziv statičke metode:

String producent = Vehicle.producer ();

2.2. Zadana metoda

Zadane metode deklariraju se pomoću novog zadano ključna riječ. Oni su dostupni putem instance klase implementacije i mogu se nadjačati.

Dodajmo a zadano metoda do našeg Vozilo sučelje, koje će također uputiti poziv na statički metoda ovog sučelja:

zadani niz getOverview () {return "ATV napravio" + proizvođač (); }

Pretpostavimo da ovo sučelje implementira klasa VoziloImpl. Za izvršavanje zadano metodu treba stvoriti instancu ove klase:

Vozilo vozila = novo VehicleImpl (); Pregled niza = vehicle.getOverview ();

3. Reference o metodama

Referenca metode može se koristiti kao kraća i čitljivija alternativa za lambda izraz koji poziva samo postojeću metodu. Postoje četiri varijante referenci metoda.

3.1. Upućivanje na statičku metodu

Referenca na statičku metodu sadrži sljedeću sintaksu: ContainingClass :: methodName.

Pokušajmo izbrojiti sve prazne nizove u Popis uz pomoć Stream API-ja.

boolean isReal = list.stream (). anyMatch (u -> User.isRealUser (u));

Pobliže pogledajte lambda izraz u anyMatch () metoda, samo upućuje poziv statičkoj metodi isRealUser (Korisnički korisnik) od Korisnik razred. Dakle, može se zamijeniti referencom na statičku metodu:

boolean isReal = list.stream (). anyMatch (User :: isRealUser);

Ova vrsta koda izgleda puno informativnije.

3.2. Upućivanje na metodu instance

Referenca na metodu instance sadrži sljedeću sintaksu: containingInstance :: methodName. Metoda slijedećih poziva isLegalName (niz niza) tipa Korisnik koji potvrđuje ulazni parametar:

Korisnik korisnik = novi korisnik (); boolean isLegalName = list.stream (). anyMatch (user :: isLegalName); 

3.3. Pozivanje na primjerenu metodu predmeta određenog tipa

Ova referentna metoda uzima sljedeću sintaksu: ContainingType :: methodName. Primjer::

dugo brojanje = list.stream (). filter (String :: isEmpty) .count ();

3.4. Upućivanje na konstruktora

Referenca na konstruktor uzima sljedeću sintaksu: Ime klase::novi. Kako je konstruktor u Javi posebna metoda, referenca metode mogla bi se primijeniti i na nju uz pomoć novikao naziv metode.

Stream stream = list.stream (). Map (User :: new);

4. Neobvezno

Prije Java 8 programeri su morali pažljivo provjeriti vrijednosti na koje su se pozivali zbog mogućnosti bacanja NullPointerException (NPE). Sve ove provjere zahtijevale su prilično dosadan i sklon pogreškama šifru.

Java 8 Neobvezno klasa može pomoći u rješavanju situacija u kojima postoji mogućnost dobivanja NPE. Radi kao spremnik za objekt tipa T. Može vratiti vrijednost ovog objekta ako ta vrijednost nije a null. Kada je vrijednost unutar ovog spremnika null omogućuje izvršavanje nekih unaprijed definiranih radnji umjesto bacanja NPE.

4.1. Stvaranje Neobvezno

Primjer Neobvezno klasa se može stvoriti uz pomoć svojih statičkih metoda:

Izborno neobavezno = Neobvezno.empty ();

Vraća prazno Neobvezno.

Niz str = "vrijednost"; Izborno neobavezno = Neobvezno.of (str);

Vraća Neobvezno koji sadrži ne-null vrijednost.

Izborno neobavezno = Izborno.ofNullable (getString ());

Vratit će Neobvezno s određenom vrijednošću ili prazno Neobvezno ako je parametar null.

4.2. Neobvezna upotreba

Na primjer, očekujete da ćete dobiti Popis a u slučaju null želite ga zamijeniti novom instancom datoteke ArrayList. Ws kodom prije Java 8 morate učiniti nešto poput ovog:

Lista popisa = getList (); Popis listOpt = popis! = Null? popis: novi ArrayList ();

S Javom 8 ista se funkcionalnost može postići s puno kraćim kodom:

Popis listOpt = getList (). IliElseGet (() -> novi ArrayList ());

Još je više uzorka koda kada trebate doći do polja nekog objekta na stari način. Pretpostavimo da imate objekt tipa Korisnik koje ima polje tipa Adresa s poljem sdrveće tipa Niz. I iz nekog razloga trebate vratiti vrijednost ulica polje ako postoje ili zadana vrijednost ako ulica je null:

Korisnik korisnik = getUser (); if (user! = null) {Adresa adresa = user.getAddress (); if (adresa! = null) {Niz ulica = adresa.getStreet (); if (street! = null) {return street; }}} return "nije navedeno";

To se može pojednostaviti pomoću Neobvezno:

Izborni korisnik = Izborni.ofNullable (getUser ()); Rezultat niza = user .map (User :: getAddress) .map (Address :: getStreet) .orElse ("nije navedeno");

U ovom smo primjeru koristili karta() metoda za pretvaranje rezultata poziva getAdress () prema Neobvezno i getStreet () do Neobvezno. Ako se neka od ovih metoda vratila null the karta() metoda bi vratila prazno Neobvezno.

Zamislite da se naši vračari vrate Neobvezno. Dakle, trebali bismo koristiti flatMap () metoda umjesto karta():

Izborno optionalUser = Izborno.ofNullable (getOptionalUser ()); Rezultat niza = optionalUser .flatMap (NeobveznoUser :: getAddress) .flatMap (IzbornoAddress :: getStreet) .orElse ("nije navedeno");

Još jedan slučaj upotrebe Neobvezno mijenja se NPE uz još jednu iznimku. Pa, kao i ranije, pokušajmo to učiniti u stilu prije Java 8:

Vrijednost niza = null; Rezultat niza = ""; pokušajte {rezultat = vrijednost.toUpperCase (); } catch (NullPointerException iznimka) {throw new CustomException (); }

A što ako koristimo Neobvezno? Odgovor je čitljiviji i jednostavniji:

Vrijednost niza = null; Izborno valueOpt = Izborno.ofNullable (vrijednost); Rezultat niza = valueOpt.orElseThrow (CustomException :: new) .toUpperCase ();

Primijetite, kako i u koju svrhu koristiti Neobvezno u vašoj je aplikaciji ozbiljna i kontroverzna odluka o dizajnu, a objašnjenje svih prednosti i nedostataka izvan je opsega ovog članka. Ako ste zainteresirani, možete dublje kopati, na internetu postoji mnoštvo zanimljivih članaka posvećenih ovom problemu. Ovaj i ovaj drugi bi mogli biti od velike pomoći.

5. Zaključak

U ovom smo članku ukratko raspravljali o nekim zanimljivim novim značajkama Java 8.

Postoje, naravno, mnoga druga dodavanja i poboljšanja koja su raširena kroz mnoge Java 8 JDK pakete i klase.

Informacije, ilustrirane u ovom članku, dobra su polazna točka za istraživanje i učenje o nekim od ovih novih značajki.

Napokon, sav izvorni kôd članka dostupan je na GitHubu.