Lambda-expresszió példákkal
Lambda-expresszió példákkal
Java eredetileg egy teljesen objektum-orientált nyelv. Kivéve primitív típusok, mind a Java - objektumok. Még tömbök, objektumok. Példányban osztály - tárgyakat. Nincs egyetlen módja annak, hogy külön meghatározni (az osztályon kívül - kb toll ..) Néhány funkció. És nincs módja annak, hogy átmenjen egy eljárás, egy érv, vagy visszatér a test a módszer eredményeként más módszerrel. Minden igaz. De ez még azelőtt volt, Java 8.
Mivel a nap a jó öreg a Swing, szükséges volt, hogy írjon névtelen osztályok, ha szükséges volt, hogy átmenjen egy bizonyos funkciókat bármilyen módszerrel. Például így néz ki, hogy adjunk egy eseménykezelő:
Itt szeretnénk hozzáadni néhány kódot a hallgató egér eseményeket. Sikerült megállapítani a névtelen osztály MouseAdapter és azonnal létrehozott egy tárgyat belőle. Ily módon mentünk további funkciói addMouseListener módszer.
Röviden, nem olyan könnyű közvetíteni egy egyszerű módszert (funkcionalitás) Java át az érveket. Ez a korlátozás kényszerítette 8 Java fejlesztők hozzá a nyelvspecifikáció ilyen lehetőség, mint a Lambda-kifejezést.
Miért Java Lambda-kifejezés?
Az ő szarkasztikus és vicces blog IEG Steve (Steve Yegge) leírja, hogyan Java világ szigorúan kötött főnév (személyek, tárgyak - tollak kb ..). Ha még nem olvasta a blogot, azt ajánlom. Ő szórakoztató és érdekes, hogy leírja, hogy pontosan miért Java adunk Lambda-kifejezés.
Lambda-expresszió hozza a Java funkcionális egység, amely oly sokáig hiányzott. Lambda-expresszió hozzájárulhat a nyelvi funkciók a par tárgyakat. Bár ez nem 100% -ban igaz, akkor látható, hogy a Lambda-kifejezés nem pedig lezárások nyújtanak hasonló lehetőségeket. Funkcionális nyelven lambda-expresszió - függvénye; de a Java, lambda-expresszió - képviseli tárgyakat, és társítani kell egy adott típusú objektum, az úgynevezett funkcionális felület. Ezután úgy véljük, hogy az általa képviselt.
A cikk Mario Fusco (Mario Fusco) „Miért Java szükséges Lambda-” kifejezés ( „Miért van szükségünk a lambda kifejezés Java”) részletesen ismerteti, hogy miért minden modern nyelveken kell biztosítani arra áramkörök.
Bevezetés a Lambda-expresszió
Lambda-expresszió Java általában a következő szintaxist (érvek) -> (test). Például:
Ezután jön néhány példát ezek Lambda-kifejezések:
A szerkezet a Lambda-expresszió
Vizsgáljuk meg a szerkezet a lambda-kifejezést:
• Lambda-kifejezéseket lehet 0 vagy több bemeneti paramétereket.
• Type beállításokkal megadható explicit vagy származhat a kontextusban. Például (int a) felírható (a)
• A paraméterek zárójelbe és vesszővel elválasztva. Például (a, b) vagy (int a, int b) vagy (String a, int b, float c)
• Ha nem, akkor kell használni az üres zárójelek. Például () -> 42
• Amikor az egyik, ha a típus nincs kifejezetten megadva, a konzolok elhagyható. Példa: egy -> vissza a * a
• A test a Lambda-expresszió tartalmazhat 0 vagy több kifejezést.
• Ha a test áll egy operátor, azt nem lehet zárójelek között, és a visszatérési érték is megadható nélkül a kulcsszó vissza.
• Ellenkező esetben a támaszra van szükség (blokk-kód), de a végén meg kell határozni, hogy a visszatérési érték a kulcsszó return (különben érvénytelen lesz visszatérési típus).
Mi a funkcionális felület
java.lang.Runnable - ez egy példa egy funkcionális interfészt. Kijelentette, csak egy módszer void run (). Emellett ott van a ActionListener felület - is működőképes. Korábban kellett használni névtelen osztályok létrehozására tárgyak esetén, amelyek a funkcionális interfészt. A Lambda-kifejezések, mindent könnyebbé vált.
Minden lambda-kifejezés implicit módon kötődnek semmilyen funkcionális felület. Például létrehozhat egy linket a futtatható felületet, amint azt az alábbi példa:
Egy ilyen átalakítás mindig végzik implicit, ha nem jelzik a funkcionális felület:
A fenti példában, a fordító automatikusan létrehoz egy lambda-kifejezést egy megvalósítása futtatható interfész Thread osztály konstruktor: nyilvános téma (futtatható r) <> .
Íme néhány példa a lambda-kifejezések és a megfelelő funkcionális felületek:
Abstract @FunctionalInterface. hozzáadott Java szerint a 8. Java nyelvet, ellenőrzi, hogy a felület deklarált működőképes. Ezen túlmenően, a Java 8 számos olyan kész felületek, funkciók használata az Lambda-kifejezéseket. @FunctionalInterface ad a fordító hibát ha kijelentem a felület nem lesz működőképes.
A következő példa határozza meg a funkcionális interfészt:
Amint meghatározásából következik, funkcionális felület csak egy absztrakt módszer. Ha megpróbál újabb elméleti módszer, akkor jön ki a fordítási hibát. például:
Meghatározása után a funkcionális felület, fel tudjuk használni, és kap minden előnyét Lambda-kifejezéseket. például:
Itt már ki saját funkcionális felület és használta a lambda-kifejezés. végre () módszer fogadására képes lambda-expresszió, mint egy érv.
Példák Lambda-expresszió
A legjobb módja annak, hogy a Lambda-kifejezést - egy pillantást néhány példa:
Menet áramlás lehet inicializálni két módja van:
Event Management Java 8 is meg lehet tenni a Lambda-kifejezést. Az alábbi két módon hozzá ActionListener eseménykezelő egy felhasználói interfész elem:
Egy egyszerű példa a kimeneti minden elemét egy adott tömb. Vegye figyelembe, hogy több, mint egy módja a lambda-kifejezés. Az alábbiakban hozunk létre egy lambda-expresszió a szokásos módon, a nyíl szintaxis, valamint egy operátor, használjuk a kettőspont (: :), amely a Java 8 átalakítja a szokásos módszer a lambda-expresszió:
Az alábbi példában a funkcionális Predicate kezelőfelület a teszt és a nyomtatott elemek, amelyek megfeleltek a tesztet. Így lehet tenni logika a lambda-kifejezés és bármit alapul.
Idézte az Lambda-kifejezéseket lehet levezetni négyzet a lista elemeit. Figyeljük meg, hogy használja a folyam () metódus lehet átalakítani a szokásos listát a patak. Java 8 ad egy elegáns osztály Stream (java.util.stream.Stream). Tartalmaz rengeteg hasznos módszer, amelynek segítségével a lambda-kifejezés. Elhaladunk a lambda-x kifejezést -> x * x az eljárás térkép (), amely alkalmazza azt az összes elem a falon. Ezt követően, akkor használja a foreach nyomtatni minden eleme a listán.
A listát, akkor vissza kell vonni a négyzetének összege a lista elemet. Lambda-expresszió lehet elérni ezt írásban csak egy sor kódot. Ebben a példában, a konvolúció módszert alkalmazzák (redukció) csökkenti (). Mi használja a térképet () metódust négyszögesítése minden elem, majd alkalmazza a csökkentése () metódus a konvolúciós összes elemet egyetlen számot.
Ellentétben Lambda-expresszió ellen névtelen osztály nevét
A fő különbség a használatát kulcsszó ezt. Anonymous osztályok kulcsszó „ez” az a névtelen osztály objektum, míg a lambda-„kifejezés ebben a” kifejezés az osztály objektumot, ahol a lambda-kifejezés használata.
Egy másik különbség a kettő között az a folyamat összeállítása. JAVA összeállítani a lambda-kifejezés, ezek átalakítása privát-módszereket. Ez használ az utasítás invokedynamic. bevezetett Java 7 dinamikus kötési eljárással. Tal Weiss (Tal Weiss) leírt blogjában a Java fordítási lambda kifejezés a bájtkódot
következtetés
Annak ellenére, hogy néhány előnye a funkcionális megközelítés, ez mindig is egyértelmű volt, hogy ezek a nyelvek
mint a Haskell is gyökeresen megváltoztatja a programozási paradigma meghonosodni a piacon. Ugyanakkor, néhány elvei ebben az irányban külön figyelmet érdemelnek. Nagyon jó látni, ha nem is forradalmi, de evolúciós módon, funkcionális nyelv funkciók fokozatosan behatolnak azok, amelyek már válnak szabványok, nyelvek, mint a C ++ és Java.