Lambda-expresie cu exemple
Java a fost inițial un limbaj complet orientat pe obiect. Cu excepția tipurilor primitive, toate în Java - sunt obiecte. Chiar și matrice sunt obiecte. Copii ale fiecărei clase - obiecte. Nu există nici un singur mod de a determina separat (în afara clasei - aprox stilouri ..) Unele funcții. Și nu există nici o modalitate de a trece o metodă ca argument sau pentru a reveni corpul metodei, ca urmare a unor alte metode. Toate adevărat. Dar asta a fost înainte de Java 8.
Deoarece zilele de bun vechi Swing, era necesar să se scrie clase anonime, atunci când a fost necesar să se treacă o anumită funcționalitate în orice metodă. De exemplu, astfel încât pare să adăugați o tratare a evenimentului:
Aici vrem să adăugați un cod în ascultător de evenimente mouse-ului. Am identificat MouseAdapter clasa anonim și a creat imediat un obiect de la ea. În acest fel, am trecut funcționalitate suplimentară în metoda addMouseListener.
Pe scurt, nu atât de ușor pentru a transmite o metodă simplă (funcționalitate), în Java, prin argumentele. Această limitare a forțat 8 dezvoltatorii Java pentru a adăuga în specificația de limbă a unei astfel de posibilitate ca Lambda-expresie.
De ce Java Lambda expresie?
În blog-ul său sarcastic și amuzant Steve piciorul (Steve Yegge) descrie modul în Java mondială este strict legată de substantive (entități, obiecte - pixuri aprox ..). Dacă nu ați citit blog-ul său, recomand. Este distractiv și interesant pentru a descrie motivul exact în Java adăugată Lambda-expresie.
Lambda-expresie aduce la unitatea funcțională Java, care este atât de mult timp lipsea. Lambda-expresie contribuie la funcționalitatea limbajului la egalitate cu obiecte. Deși nu este 100% adevărat, se poate observa că Lambda expresia nu este de închidere oferă oportunități similare. Într-un limbaj funcțional lambda-expresie - o funcție; dar în Java, lambda-expresie - sunt reprezentate de obiecte, și trebuie să fie asociat cu un tip de obiect specific, numit o interfață funcțională. În continuare, considerăm că aceasta reprezintă.
Articolul Mario Fusco (Mario Fusco) „De ce în Java nevoie Lambda expresia“ ( „De ce avem nevoie de Lambda Expression în Java“) este descrisă în detaliu, de ce toate limbile moderne au nevoie de oportunități circuite.
Introducere în Lambda-expresie
Lambda-exprimare în Java obicei, au următoarea sintaxă (argumente) -> (corp). De exemplu:
Urmează câteva exemple ale acestor lambda-expresii:
Structura Lambda-expresie
Să examinăm structura lambda-expresie:
• Lambda-expresiile pot avea 0 sau mai mulți parametri de intrare.
• Setările de tip pot fi specificate explicit sau pot fi derivate din context. De exemplu, (int a) poate fi scrisă ca (a)
• Parametrii sunt paranteze și separate prin virgulă. De exemplu (a, b) sau (int a, int b) sau (String a, int b, float c)
• Dacă nu, trebuie să utilizați paranteze goale. De exemplu, () -> 42
• Când unul în cazul în care tipul nu este specificat în mod explicit, parantezele pot fi omise. Exemplu: a -> returna * o
• Corpul Lambda-expresie poate conține 0 sau mai multe expresii.
• În cazul în care organismul este format dintr-un singur operator, acesta nu poate fi inclus intre paranteze, iar valoarea returnată poate fi specificată fără întoarcere de cuvinte cheie.
• În caz contrar, bretelele sunt necesare (bloc de cod), dar în cele din urmă, este necesar să se precizeze valoarea returnată utilizând randamentul de cuvinte cheie (în caz contrar acesta va fi de tip void).
Care este interfața funcțională
java.lang.Runnable - acesta este un exemplu de o interfață funcțională. Acesta a declarat doar o singură metodă run void (). De asemenea, există interfața ActionListener - de asemenea, funcțională. Anterior, a trebuit sa folosim clase anonime pentru a crea obiecte care implementeaza interfata functionala. Cu Lambda-expresii, totul a devenit mai ușor.
Fiecare lambda-expresie poate fi legat în mod implicit la orice interfață funcțională. De exemplu, puteți crea un link la interfața Runnable, așa cum se arată în exemplul următor:
O astfel de transformare se face întotdeauna în mod implicit atunci când nu indică interfață funcțională:
In exemplul de mai sus, compilatorul creează automat un lambda-expresie ca o implementare a Runnable constructor interfață clasă Subiect: Subiect publica (r Runnable) <> .
Iată câteva exemple de lambda-expresii și interfețe funcționale corespunzătoare:
@FunctionalInterface Rezumat. adăugat în Java 8 în conformitate cu specificația limbajul Java, se verifică dacă interfața să fie declarată operațională. În plus, Java 8 include un număr de interfețe gata făcute, funcții pentru utilizare cu Lambda-expresii. @FunctionalInterface va da o eroare de compilator dacă declarați interfața nu va fi funcțional.
Următorul exemplu definește interfața funcțională:
Astfel cum rezultă din definiția, interfața funcțională poate avea doar o singură metodă abstractă. Dacă încercați să adăugați o altă metodă abstractă, ea va ieși o eroare de compilare. exemplu:
După determinarea interfața funcțională, putem folosi și pentru a obține toate beneficiile Lambda-expresii. exemplu:
Aici ne-am definit propria interfață funcțională și a folosit lambda-expresie. executa metoda () capabil să primească lambda expresie ca argument.
Exemple Lambda-expresie
Cel mai bun mod de a ajunge la Lambda expresia - o privire la câteva exemple:
fluxul de fir poate fi inițializat în două moduri:
Event Management în Java 8 poate fi făcută prin intermediul Lambda expresie. Următoarele sunt două moduri de a adăuga tratare a evenimentului ActionListener într-o componentă de interfață de utilizator:
Un exemplu simplu de ieșire a tuturor elementelor unui anumit tablou. Rețineți că există mai mult de un mod de a folosi lambda-expresie. Mai jos vom crea un lambda-expresie în mod obișnuit, folosind sintaxa săgeată, precum și un operator, folosim un colon dublu (: :), care în Java 8 convertește metoda normală în lambda-expresie:
În exemplul următor, vom folosi interfata predicatului funcțională pentru crearea elementelor de testare și de imprimare care au trecut acest test. În acest fel puteți pune logica în lambda-expresie și de a face ceva bazat pe el.
Chemat peste Lambda Expresiile pot fi derivate pătrat al fiecărui element din listă. Rețineți că vom folosi metoda fluxului () pentru a converti lista obișnuită a fluxului. Java 8 oferă un flux de clasa chic (java.util.stream.Stream). Acesta conține tone de metode utile pe care le puteți utiliza lambda-expresie. Noi trece lambda-expresie x -> x * x în harta metoda (), care se aplică la toate articolele din flux. După aceea, vom folosi foreach pentru a imprima toate elementele listei.
Pentru o listă, este necesar să se retragă suma pătratelor elementului din listă. Lambda-expresie se poate realiza acest lucru scriind doar o singură linie de cod. În acest exemplu, se utilizează metoda convoluție (reducere) reducerea (). Noi folosim metoda harta () pentru cvadratura fiecare element, și apoi se aplică metoda de a reduce () pentru convoluție tuturor elementelor dintr-un singur număr.
Spre deosebire de Lambda-expresie împotriva numelor clasei anonime
Principala diferență este utilizarea de cuvinte cheie acest lucru. Anonim clase de cuvinte cheie „această“ se referă la obiectul de clasă anonimă, în timp ce în lambda-expresia „aceasta“ se referă la obiectul de clasă în care este utilizat lambda-expresie.
O altă diferență între ele se află în procesul de compilare. Java compila lambda-expresie cu convertirea lor într-un privat-metode. Se folosește invokedynamic de instrucțiuni. introdus în Java 7 pentru metoda de legare dinamică. Tal Weiss (Tal Weiss) descris în blogul său ca expresie Java compilare lambda în bytecode
concluzie
În ciuda unor avantaje ale abordării funcționale, a fost întotdeauna clar că aceste limbi
cum ar fi Haskell, schimbă prea radical paradigma de programare pentru a prinde rădăcini în piață. În același timp, unele dintre principiile acestei direcții merită o atenție specială. Foarte frumos pentru a vedea, dacă nu este revoluționar, dar evolutiv mod, limbaj funcțional caracteristici pătrunde treptat în cele care au devenit deja standarde, limbaje cum ar fi C ++ si Java.