Nye funksjoner i Java 8

1. Oversikt

I denne artikkelen ser vi raskt på noen av de mest interessante nye funksjonene i Java 8.

Vi vil snakke om: grensesnittets standard- og statiske metoder, metodereferanse og valgfritt.

Vi har allerede dekket noen av funksjonene i Java 8-utgivelsen - stream API, lambda-uttrykk og funksjonelle grensesnitt - ettersom de er omfattende emner som fortjener et eget utseende.

2. Grensesnittets standard- og statiske metoder

Før Java 8 kunne grensesnitt bare ha offentlige abstrakte metoder. Det var ikke mulig å legge til ny funksjonalitet i det eksisterende grensesnittet uten å tvinge alle implementeringsklasser til å lage en implementering av de nye metodene, og det var heller ikke mulig å lage grensesnittmetoder med en implementering.

Fra og med Java 8, kan grensesnitt ha statisk og misligholde metoder som til tross for at de er erklært i et grensesnitt, har en definert oppførsel.

2.1. Statisk metode

Tenk på følgende metode for grensesnittet (la oss kalle dette grensesnittet Kjøretøy):

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

Det statiske produsent() metoden er bare tilgjengelig gjennom og inne i et grensesnitt. Det kan ikke overstyres av en implementeringsklasse.

For å kalle det utenfor grensesnittet, bør standardtilnærmingen for statisk metodeanrop brukes:

Strengprodusent = Vehicle.producer ();

2.2. Standardmetode

Standardmetoder blir erklært ved hjelp av den nye misligholde nøkkelord. Disse er tilgjengelige gjennom forekomsten av implementeringsklassen og kan overstyres.

La oss legge til en misligholde metode til vår Kjøretøy grensesnitt, som også vil ringe til statisk metoden for dette grensesnittet:

standard String getOverview () {return "ATV laget av" + produsent (); }

Anta at dette grensesnittet er implementert av klassen VehicleImpl. For å utføre misligholde metode en forekomst av denne klassen skal opprettes:

Vehicle vehicle = new VehicleImpl (); Strengoversikt = vehicle.getOverview ();

3. Metode Referanser

Metodereferanse kan brukes som et kortere og mer lesbart alternativ for et lambdauttrykk som bare kaller en eksisterende metode. Det er fire varianter av metodereferanser.

3.1. Henvisning til en statisk metode

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

La oss prøve å telle alle tomme strenger i Liste ved hjelp av Stream API.

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

Se nærmere på lambdauttrykk i anyMatch () metoden, ringer den bare til en statisk metode isRealUser (brukerbruker) av Bruker klasse. Så det kan erstattes med en referanse til en statisk metode:

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

Denne typen kode ser mye mer informativ ut.

3.2. Henvisning til en instansemetode

Henvisningen til en forekomstmetode inneholder følgende syntaks: containingInstance :: methodName. Følgende kodeanropsmetode isLegalName (strengstreng) av typen Bruker som validerer en inngangsparameter:

Brukerbruker = ny bruker (); boolsk isLegalName = list.stream (). anyMatch (bruker :: isLegalName); 

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

Denne referansemetoden tar følgende syntaks: ContainingType :: methodName. Et eksempel::

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

3.4. Henvisning til en konstruktør

En referanse til en konstruktør tar følgende syntaks: Klassenavn::ny. Ettersom konstruktør i Java er en spesiell metode, kan metodereferanse også brukes på den ved hjelp av nysom et metodenavn.

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

4. Valgfri

Før Java 8-utviklere måtte nøye validere verdier de refererte til på grunn av muligheten for å kaste NullPointerException (NPE). Alle disse kontrollene krevde en ganske irriterende og feilutsatt kjeleplatekode.

Java 8 Valgfri klassen kan hjelpe til med å håndtere situasjoner der det er mulighet for å få NPE. Det fungerer som en beholder for objektet av typen T. Det kan returnere en verdi av dette objektet hvis denne verdien ikke er en null. Når verdien i denne beholderen er null det tillater å gjøre noen forhåndsdefinerte handlinger i stedet for å kaste NPE.

4.1. Opprettelse av Valgfri

En forekomst av Valgfri klasse kan opprettes ved hjelp av statiske metoder:

Valgfritt valgfritt = Optional.empty ();

Returnerer en tom Valgfri.

Streng str = "verdi"; Valgfritt valgfritt = Valgfritt. Av (str);

Returnerer en Valgfri som inneholder en ikke-null verdi.

Valgfritt valgfritt = Valgfritt.ofNullable (getString ());

Vil returnere en Valgfri med en bestemt verdi eller en tom Valgfri hvis parameteren er null.

4.2. Valgfri bruk

For eksempel forventer du å få en Liste og i tilfelle null du vil erstatte den med en ny forekomst av en ArrayList. Wmed koden før Java 8 må du gjøre noe sånt:

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

Med Java 8 kan den samme funksjonaliteten oppnås med en mye kortere kode:

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

Det er enda mer kokerplatekode når du trenger å nå et objektfelt på den gamle måten. Anta at du har et objekt av typen Bruker som har et felt av typen Adresse med et felt street av typen String. Og av en eller annen grunn må du returnere en verdi av gate felt hvis noen eksisterer eller en standardverdi hvis gate er null:

Brukerbruker = getUser (); hvis (bruker! = null) {Adresse-adresse = bruker.getAddress (); hvis (adresse! = null) {Strenggate = adresse.getStreet (); hvis (gate! = null) {returgate; }}} returner "ikke spesifisert";

Dette kan forenkles med Valgfri:

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

I dette eksemplet brukte vi kart() metode for å konvertere resultatene av å ringe getAdress () til Valgfri og getStreet () til Valgfri. Hvis noen av disse metodene returnerte null de kart() metoden vil returnere en tom Valgfri.

Tenk deg at getterne våre kommer tilbake Valgfri. Så, vi bør bruke flatMap () metoden i stedet for kart():

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

En annen brukssak av Valgfri endrer seg NPE med et annet unntak. Så, som vi gjorde tidligere, la oss prøve å gjøre dette i pre-Java 8-stil:

Strengverdi = null; Strengresultat = ""; prøv {resultat = value.toUpperCase (); } fange (NullPointerException unntak) {throw new CustomException (); }

Og hva om vi bruker Valgfri? Svaret er mer leselig og enklere:

Strengverdi = null; Valgfri valueOpt = Optional.ofNullable (verdi); Strengresultat = valueOpt.orElseThrow (CustomException :: new) .toUpperCase ();

Legg merke til at hvordan og for hvilket formål å bruke Valgfri i appen din er en seriøs og kontroversiell designbeslutning, og forklaring på alle fordeler og ulemper er utenfor omfanget av denne artikkelen. Hvis du er interessert, kan du grave dypere, det er mange interessante artikler på Internett viet til dette problemet. Denne og denne andre kan være veldig hjelpsomme.

5. Konklusjon

I denne artikkelen diskuterer vi kort noen interessante nye funksjoner i Java 8.

Det er selvfølgelig mange andre tillegg og forbedringer som er spredt over mange Java 8 JDK-pakker og klasser.

Men informasjonen illustrert i denne artikkelen er et godt utgangspunkt for å utforske og lære om noen av disse nye funksjonene.

Til slutt er all kildekoden for artikkelen tilgjengelig på GitHub.