Primele lucruri mai întâi.
Metode implicite în interfețe.
Interfața este acum posibil să se definească metode statice. Faptul că până la 8 pentru o anumită interfață Java, de exemplu, ai angajaților, angajații de acolo o clasă care conține metode statice pentru generarea de obiecte angajaților și de a lucra cu ei. Ușor de inovare este faptul că aceste aceleași metode vor fi în interfața în sine, ci despre clasa dezvoltator Angajații vor fi uitate.
Ca un exemplu, uita-te la metoda naturalOrder care a fost adăugat la java.util.Comparator
Interfețele pot declara metode implicite. Aruncati o privire la foreach în java.lang.Iterable: Metoda implicită - o metodă de interfață cu logica pusă în aplicare, care nu trebuie neapărat să fie definit în punerea în aplicare a acestei interfețe.
În versiunile anterioare ale JDK pentru a adăuga metode în interfața biblioteca standard nu a fost posibil, ar distruge întregul cod de utilizator, deoarece pentru fiecare punere în aplicare interfață ar trebui să adauge punerea în aplicare a noii metode lipsă. 8 în interfețele standard de Java extins multe metode implicite.
Este demn de remarcat de ce interfețele nu pune în aplicare hashCode implicit, este egal, și toString. Faptul că obiectele care implementeaza interfata, sunt moștenitorii obiectului, care a identificat deja aceste metode în mod implicit. Devine clar care a metodei standard poartă numele - cel care este definită în interfața, sau cea din clasa părinte.
interfețe funcționale.
Interfață funcțională - aceasta este interfața care definește o singură metodă abstractă, ca, de exemplu, java.lang.Runnable:
Pentru a determina cu exactitate a interfeței ca adnotare funcțională adăugată @FunctionalInterface, care lucrează pe principiul @ Suprascriere. Acesta va marca planul și nu va identifica doua metodă abstractă în interfața.
Notă, interfața poate include orice număr de metode implicite și să fie încă funcțională, deoarece metodele implicite - nu abstractă.
Lambda Expresiile
Cea mai importantă inovație în Java 8 - o expresie lambda. Dacă spui, în general, că acestea sunt înțelese ca metode anonime, care, astfel, reprezintă, de asemenea, un obiect care poate fi atribuite variabilelor și a trecut ca un argument pentru alte metode. exemplu:
Aici, datorită unei astfel de expresie lambda, vom reduce semnificativ cod. Cum ar arăta fără lambda: Noua versiune a introdus, de asemenea, o sintaxă specială de trimiteri la metodele, care, în esență, - o formă prescurtată a unor expresii lambda:
String :: valueOf x -> String.valueOf (x)
Obiect :: toString x -> x.toString ()
x :: toString () -> x.toString ()
ArrayList :: noi () -> new ArrayList<>()
java.util.function
O altă inovație JDK - un set de interfețe funcționale, care vor fi foarte utile. Luați în considerare unele dintre ele:
funcție
predicat
consumator
Furnizor
BinaryOperator
Pachetul este de asemenea echipat cu implementări primitive de interfețe pentru tipuri de date int, lung, și dublu.
java.util.stream
java.util.stream a introdus pentru a sprijini paralelismul în fire. Acum fluxuri sunt împărțite în serie și în paralel. Cel mai mare beneficiu al acestei - în colecțiile:
Stream este prevăzut cu un API flexibil pentru conversie de date și care funcționează pe ele. Așa am, de exemplu, pentru a găsi rapid greutatea totală roșu individual și blocurile albastre în colecția: Ce se întâmplă în codul:
1) Din colecția de blocuri vom obține flux
2) Metoda de filtrare returnează un alt flux, care conține deja elementele o singură culoare. Acesta este un intermediar de clasă Stream (intermediar) metodă.
3) Metoda mapToInt este invocată la stream'a care se obține la punctul 2), și returnează fluxul, care nu conțin ele însele elemente, iar greutatea lor proprietăți (adică în greutate)
4) Metoda sumă se numește în stream'a alineatului 3), se rezumă toată greutatea și returnează un int simplu. Acesta este ultimul (terminal) metoda, returneaza un singur rezultat.
În general, stilul este foarte similar cu cel folosit în programarea funcțională, care este bun, deoarece o soluție simplificată la o gamă largă de sarcini comune.
Stream poate fi parallelized, iar apoi efectuarea operațiunilor asupra lor va crește, pentru că sarcina este distribuită tuturor miezului procesorului. Hai să facem o numărarea paralelă a elementelor:
Singura diferență este că acum metoda se numește parallelStream, și fiecare urmând metoda intermediară se va returna un flux paralel. Astfel, întreaga unitate de calcul distribuit pentru toate core procesor.
Asigurați-vă flux serial înapoi metodă posibilă de declanșare secvențială (). Acest lucru este util atunci când, de exemplu, trebuie să selectați elementele de culoare a fost paralel, și calcularea sumei de greutate - de serie:
Dacă sunteți familiarizat cu Joda de timp, apoi să învețe o nouă API va fi foarte ușor. Aproape totul în java.time este imuabil. Spre deosebire de data API-ul vechi / valori de timp, cum ar fi lunile și zilele săptămânii sunt puse în aplicare prin intermediul enum.
clase de bază java.time:
* LocalDateTime, LOCALDATE, LOCALTIME - Data și ora. Acesta este păstrat la într-o nanosecundă, astfel încât LOCALTIME pot fi depozitate, de exemplu, o valoare de „13: 45.30.123456789“. Există mai multe metode convenabile, cum ar fi plusMinutes, plusHours, isAfter, toSecondOfDay etc.
* An, Luna, anulLuna, MONTHDAY, DAYOFWEEK - tipuri asociate cu datele, pentru a primi mai mult gama. Deci, valoarea An poate fi de la „-999999999“ la „999999999“
* Durata, Perioada - util atunci când doriți să-și exprime datele ca „3 ani, 2 luni și 18 zile“ sau „3 ore 45 minute și 8 secunde“
În această inovație Java 8 nu va ajunge la un sfârșit, și am învățat cele mai anticipate în noua versiune a JDK. Toate colecția standard a fost extins multe metode convenabile și au fost capabili să paralelism în ele cu java.util.stream. Împreună cu java.util.function Java idiomuri primit de programare funcțională. expresii Lambda, desigur, va reduce cantitatea de cod pe care dezvoltatorii trebuie să scrie, și un nou API pentru lucrul cu data și ora a venit să înlocuiască vechea ordine depășite.
admin liberal4ik AlexVovolka maxiflash annagrin007 alexanzer vanya88 Anastassia Proteine d3m0n1c nick_kryloff Andrey_G Cr0s dydus0x14 AngryCellophane AndrewRogovets t1oo1 san Basuliic dmytro_p Victor_MM Diesel31ks MrNikita alekseysamoylov swyd nv_yunko ortodox