Új szolgáltatások a Java 8-ban

1. Áttekintés

Ebben a cikkben gyorsan áttekintjük a Java 8 legérdekesebb új funkcióit.

Beszélünk: az interfész alapértelmezett és statikus módszereiről, a módszer referenciájáról és az Opcionálisról.

A Java 8 kiadásának néhány funkcióját - stream API, lambda kifejezések és funkcionális interfészek - már áttekintettük, mivel ezek átfogó témák, amelyek külön megérdemelést érdemelnek.

2. Alapértelmezett interfész és statikus módszerek

A Java 8 előtt az interfészek csak nyilvános elvont módszerekkel rendelkezhetnek. Nem volt lehetséges új funkcionalitást hozzáadni a meglévő felülethez anélkül, hogy az összes implementációs osztályt arra kényszerítették volna, hogy létrehozzák az új módszerek implementációját, sem pedig nem lehetett interfész-módszereket létrehozni megvalósítással.

A Java 8-tól kezdve az interfészek rendelkezhetnek statikus és alapértelmezett módszerek, amelyek annak ellenére, hogy deklarálva vannak egy interfészen, meghatározott viselkedéssel bírnak.

2.1. Statikus módszer

Vegye figyelembe az interfész következő módszerét (nevezzük ezt az interfészt Jármű):

statikus karakterlánc előállító () {return "N&F Vehicles"; }

A statikus termelő() módszer csak egy interfészen belül és belül érhető el. Egy végrehajtó osztály nem tudja felülírni.

Az interfészen kívüli híváshoz a statikus módszeres hívás standard megközelítését kell alkalmazni:

Húrtermelő = Jármű.gyártó ();

2.2. Alapértelmezett módszer

Az alapértelmezett módszereket az új használatával deklaráljuk alapértelmezett kulcsszó. Ezek az implementáló osztály példányán keresztül érhetők el, és felülírhatók.

Tegyük hozzá a alapértelmezett módszer a mi Jármű interfész, amely szintén felhívja a statikus ennek az interfésznek a módszere:

alapértelmezett String getOverview () {return "ATV készítette" + producer (); }

Tegyük fel, hogy ezt az interfészt az osztály valósítja meg VehicleImpl. A. Végrehajtásához alapértelmezett metódusnak létre kell hoznia ennek az osztálynak a példányát:

Jármű jármű = új VehicleImpl (); Karakterlánc áttekintése = vehicle.getOverview ();

3. Módszer hivatkozások

A módszer referenciája rövidebb és olvashatóbb alternatívaként használható egy lambda kifejezéshez, amely csak létező módszert hív meg. A módszerre való hivatkozásoknak négy változata van.

3.1. Hivatkozás statikus módszerre

A statikus módszerre való hivatkozás a következő szintaxist tartalmazza: ContainingClass :: methodName.

Próbáljuk megszámolni az összes üres karakterláncot a Lista a Stream API segítségével.

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

Vizsgálja meg közelebbről a lambda kifejezést anyMatch () metódus, csak egy statikus metódust hív meg isRealUser (felhasználói felhasználó) a Felhasználó osztály. Tehát helyettesíthető egy statikus módszerre való hivatkozással:

logikai isReal = list.stream (). anyMatch (Felhasználó :: isRealUser);

Ez a típusú kód sokkal informatívabbnak tűnik.

3.2. Hivatkozás egy példamódszerre

A példány metódusra való hivatkozás a következő szintaxist tartalmazza: containingInstance :: methodName. Kódhívási módszer követése isLegalName (Karaktersorozat) típusú Felhasználó amely egy bemeneti paramétert érvényesít:

Felhasználó felhasználó = új Felhasználó (); logikai isLegalName = list.stream (). anyMatch (user :: isLegalName); 

3.3. Hivatkozás egy adott típusú objektum példánymódszerére

Ez a referenciamódszer a következő szintaxist veszi igénybe: ContainingType :: methodName. Egy példa::

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

3.4. Hivatkozás egy kivitelezőre

A konstruktorra történő hivatkozás a következő szintaxist veszi át: Osztály név::új. Mivel a Java konstruktor egy speciális módszer, a módszerre való hivatkozás rá is alkalmazható újmint módszer neve.

Stream stream = list.stream (). Map (Felhasználó :: új);

4. Választható

Mielőtt a Java 8 fejlesztőknek gondosan ellenőrizniük kellett az általuk hivatkozott értékeket, a NullPointerException (NPE). Mindezek az ellenőrzések elég idegesítő és hibára hajlamos kazán kódot igényeltek.

Java 8 Választható osztály segíthet kezelni azokat a helyzeteket, ahol lehetőség van a NPE. Konténerként működik a típusú objektum számára T. Visszaadhatja az objektum értékét, ha ez az érték nem a nulla. Amikor a tárolóban lévő érték nulla dobás helyett néhány előre definiált műveletet tesz lehetővé NPE.

4.1. A Választható

A Választható osztály statikus metódusai segítségével létrehozható:

Opcionális opcionális = Opcionális.empty ();

Üreset ad vissza Választható.

String str = "érték"; Opcionális opcionális = Opcionális.of (str);

Visszaad egy Választható amely nem null értéket tartalmaz.

Opcionális választható = Opcionális.Nullable (getString ());

Vissza fog adni egy Választható meghatározott értékkel vagy üres Választható ha a paraméter nulla.

4.2. Opcionális használat

Például arra számít, hogy a Lista és abban az esetben nulla egy új példányával szeretné helyettesíteni Tömb lista. WA Java 8 előtti kóddal ilyesmit kell tennie:

Lista lista = getList (); List listOpt = lista! = Null? lista: új ArrayList ();

A Java 8 segítségével ugyanez a funkció elérhető sokkal rövidebb kóddal:

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

Még több kazánlapkód van, ha valamilyen tárgy mezőjéhez a régi módon kell eljutnia. Tegyük fel, hogy van egy típusú objektuma Felhasználó amelynek típusú mezője van Cím mezővel sfát típusú Húr. És valamilyen okból vissza kell adnia a utca mező, ha vannak ilyenek, vagy alapértelmezett érték, ha utca van nulla:

Felhasználói felhasználó = getUser (); if (felhasználó! = null) {Cím címe = user.getAddress (); if (cím! = null) {Karakterlánc utca = cím.getStreet (); if (utca! = null) {visszatérő utca; }}} return "nincs megadva";

Ezt leegyszerűsíthetjük Választható:

Opcionális felhasználó = Optional.ofNullable (getUser ()); Karakterlánc eredménye = felhasználó .map (Felhasználó :: getAddress) .térkép (Cím :: getStreet) .orElse ("nincs megadva");

Ebben a példában a térkép() metódus a getAdress () hoz Választható és getStreet () nak nek Választható. Ha ezen módszerek bármelyike ​​visszatért nulla a térkép() módszer üreset adna vissza Választható.

Képzelje el, hogy a gettereink visszatérnek Választható. Tehát használnunk kell a flatMap () módszer helyett térkép():

Opcionális optionalUser = Opcionális.Nullable (getOptionalUser ()); Karakterlánc eredménye = optionalUser .flatMap (OptionalUser :: getAddress) .flatMap (OptionalAddress :: getStreet) .orElse ("nincs megadva");

Egy másik felhasználási esete Választható változik NPE egy másik kivétellel. Tehát, ahogy korábban tettük, próbáljuk meg ezt a Java 8 előtti stílusban megtenni:

Karakterlánc értéke = null; Karakterlánc eredménye = ""; próbáld ki az {eredmény = érték.toUpperCase (); } catch (NullPointerException kivétel) {dobja az új CustomException-t (); }

És mi van, ha használjuk Választható? A válasz olvashatóbb és egyszerűbb:

Karakterlánc értéke = null; Opcionális valueOpt = Opcionális.Nullable (érték); Karakterlánc eredménye = valueOpt.orElseThrow (CustomException :: new) .toUpperCase ();

Figyelje meg, hogy hogyan és milyen célra használja Választható az alkalmazásodban komoly és ellentmondásos tervezési döntés, és minden előnyének és hátrányának magyarázata nem tartozik e cikk hatálya alá. Ha érdekel, elmélyülhet, az interneten rengeteg érdekes cikk foglalkozik ezzel a problémával. Ez és ez a másik nagyon hasznos lehet.

5. Következtetés

Ebben a cikkben röviden áttekintjük a Java 8 néhány érdekes új funkcióját.

Természetesen sok más kiegészítés és fejlesztés is elterjedt számos Java 8 JDK csomagban és osztályban.

De az ebben a cikkben bemutatott információk jó kiindulópontok ezeknek az új funkcióknak a feltárásához és megismeréséhez.

Végül a cikk összes forráskódja elérhető a GitHubon.


$config[zx-auto] not found$config[zx-overlay] not found