Nye funktioner i Java 8

1. Oversigt

I denne artikel ser vi hurtigt på nogle af de mest interessante nye funktioner i Java 8.

Vi vil tale om: interface standard og statiske metoder, metodehenvisning og valgfri.

Vi har allerede dækket nogle af funktionerne i Java 8's udgivelse - stream API, lambda-udtryk og funktionelle grænseflader - da de er omfattende emner, der fortjener et separat udseende.

2. Interface standard og statiske metoder

Før Java 8 kunne grænseflader kun have offentlige abstrakte metoder. Det var ikke muligt at tilføje ny funktionalitet til den eksisterende grænseflade uden at tvinge alle implementeringsklasser til at oprette en implementering af de nye metoder, og det var heller ikke muligt at oprette grænseflademetoder med en implementering.

Startende med Java 8 kan grænseflader have statisk og Standard metoder, der til trods for at deklareres i en grænseflade har en defineret adfærd.

2.1. Statisk metode

Overvej følgende metode til grænsefladen (lad os kalde denne grænseflade Køretøj):

statisk strengproducent () {return "N&F Vehicles"; }

Det statiske producent() metoden er kun tilgængelig gennem og inde i en grænseflade. Det kan ikke tilsidesættes af en implementeringsklasse.

For at kalde det uden for grænsefladen skal standardmetoden for statisk metodeopkald bruges:

Stringproducent = Vehicle.producer ();

2.2. Standardmetode

Standardmetoder erklæres ved hjælp af den nye Standard nøgleord. Disse er tilgængelige gennem forekomsten af ​​implementeringsklassen og kan tilsidesættes.

Lad os tilføje en Standard metode til vores Køretøj interface, som også ringer til statisk metode til denne grænseflade:

standard String getOverview () {returner "ATV lavet af" + producent (); }

Antag, at denne grænseflade er implementeret af klassen VehicleImpl. Til udførelse af Standard metode en instans af denne klasse skal oprettes:

Køretøjskøretøj = nyt VehicleImpl (); Strengoversigt = vehicle.getOverview ();

3. Metodehenvisninger

Metodehenvisning kan bruges som et kortere og mere læsbart alternativ til et lambdaekspression, der kun kalder en eksisterende metode. Der er fire varianter af metodereferencer.

3.1. Henvisning til en statisk metode

Henvisningen til en statisk metode indeholder følgende syntaks: ContainingClass :: methodName.

Lad os prøve at tælle alle tomme strenge i Liste ved hjælp af Stream API.

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

Se nærmere på lambda-udtryk i anyMatch () metode, kaldes det bare til en statisk metode isRealUser (brugerbruger) af Bruger klasse. Så det kan erstattes med en henvisning til en statisk metode:

boolsk isReal = list.stream (). anyMatch (Bruger :: isRealUser);

Denne type kode ser meget mere informativ ud.

3.2. Henvisning til en instansmetode

Henvisningen til en instansmetode indeholder følgende syntaks: containingInstance :: methodName. Følgende kodeopkaldsmetode isLegalName (strengstreng) af typen Bruger der validerer en inputparameter:

Brugerbruger = ny bruger (); boolsk isLegalName = list.stream (). anyMatch (bruger :: isLegalName); 

3.3. Henvisning til en instansmetode for et objekt af en bestemt type

Denne referencemetode tager følgende syntaks: ContainingType :: methodName. Et eksempel::

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

3.4. Henvisning til en konstruktør

En henvisning til en konstruktør tager følgende syntaks: ClassName::ny. Da konstruktør i Java er en speciel metode, kunne metodereferencer også anvendes på den ved hjælp af nysom et metodenavn.

Stream stream = list.stream (). Map (Bruger :: ny);

4. Valgfri

Før Java 8-udviklere nødt til nøje at validere værdier, de henviste til, på grund af en mulighed for at kaste NullPointerException (NPE). Alle disse kontroller krævede en ret irriterende og fejlbehæftet kedelpladekode.

Java 8 Valgfri klasse kan hjælpe med at håndtere situationer, hvor der er mulighed for at få NPE. Det fungerer som en beholder til objektet af typen T. Det kan returnere en værdi af dette objekt, hvis denne værdi ikke er en nul. Når værdien inde i denne container er nul det tillader at udføre nogle foruddefinerede handlinger i stedet for at kaste NPE.

4.1. Oprettelse af Valgfri

En forekomst af Valgfri klasse kan oprettes ved hjælp af dens statiske metoder:

Valgfri valgfri = Optional.empty ();

Returnerer en tom Valgfri.

Streng str = "værdi"; Valgfri valgfri = Valgfri. Af (str);

Returnerer en Valgfri som indeholder en ikke-nul værdi.

Valgfri valgfri = Valgfri.ofNullable (getString ());

Vil returnere en Valgfri med en bestemt værdi eller en tom Valgfri hvis parameteren er nul.

4.2. Valgfri anvendelse

For eksempel forventer du at få en Liste og i tilfælde af nul du vil erstatte det med en ny forekomst af en ArrayList. Wmed kode før Java 8 skal du gøre noget som dette:

Liste liste = getList (); Liste listeOpt = liste! = Null? liste: ny ArrayList ();

Med Java 8 kan den samme funktionalitet opnås med en meget kortere kode:

List listOpt = getList (). OrElseGet (() -> new ArrayList ());

Der er endnu mere kedelpladekode, når du har brug for at nå et objektfelt på den gamle måde. Antag, at du har et objekt af typen Bruger som har et felt af typen Adresse med et felt street af typen Snor. Og af en eller anden grund skal du returnere en værdi af gade felt, hvis der findes nogle, eller en standardværdi, hvis gade er nul:

Brugerbruger = getUser (); hvis (bruger! = null) {Adresse-adresse = bruger.getAddress (); hvis (adresse! = null) {String street = address.getStreet (); hvis (gade! = null) {retur gade; }}} returner "ikke specificeret";

Dette kan forenkles med Valgfri:

Valgfri bruger = Optional.ofNullable (getUser ()); String result = user .map (User :: getAddress) .map (Address :: getStreet) .orElse ("ikke specificeret");

I dette eksempel brugte vi kort() metode til at konvertere resultaterne af at kalde getAdress () til Valgfri og getStreet () til Valgfri. Hvis nogen af ​​disse metoder returneres nul det kort() metode ville returnere en tom Valgfri.

Forestil dig, at vores getters vender tilbage Valgfri. Så vi skal bruge flatMap () metode i stedet for kort():

Valgfri optionalUser = Optional.ofNullable (getOptionalUser ()); Strengresultat = optionalUser .flatMap (OptionalUser :: getAddress) .flatMap (OptionalAddress :: getStreet) .orElse ("ikke specificeret");

Et andet brugssag om Valgfri ændrer sig NPE med en anden undtagelse. Så som vi gjorde tidligere, lad os prøve at gøre dette i præ-Java 8-stil:

Strengværdi = null; Strengresultat = ""; prøv {resultat = value.toUpperCase (); } fange (NullPointerException undtagelse) {kast ny CustomException (); }

Og hvad hvis vi bruger Valgfri? Svaret er mere læsbart og enklere:

Strengværdi = null; Valgfri værdiOpt = Optional.ofNullable (værdi); String result = valueOpt.orElseThrow (CustomException :: new) .toUpperCase ();

Bemærk, at hvordan og til hvilket formål at bruge Valgfri i din app er en seriøs og kontroversiel designbeslutning, og forklaring på dens alle fordele og ulemper er uden for anvendelsesområdet for denne artikel. Hvis du er interesseret, kan du grave dybere, der er masser af interessante artikler på Internettet viet til dette problem. Denne og den anden kunne være meget nyttige.

5. Konklusion

I denne artikel diskuterer vi kort nogle interessante nye funktioner i Java 8.

Der er selvfølgelig mange andre tilføjelser og forbedringer, der er spredt på mange Java 8 JDK-pakker og klasser.

Men de oplysninger, der er illustreret i denne artikel, er et godt udgangspunkt for at udforske og lære om nogle af disse nye funktioner.

Endelig er al kildekoden til artiklen tilgængelig på GitHub.