Változások a nyelv java 8
Lambda kifejezések és változások interfész osztály a Java 8 új nyelvet
Java ™ 8-as verzió tartalmaz lényeges új nyelvi jellemzőket, amelyek a fejlesztők könnyebben is meg lehet építeni programokat. T. N. Lambda kifejezések (lamba kifejezés) meg egy új szintaxis a beágyazott kód blokkokat, amely ugyanolyan rugalmas névtelen belső osztályok, de a jelentősen csökkent számú sablonok (boilerplate). Változások az átmeneti terület lehetővé teszi, hogy adjunk nekik a meglévő felület feláldozása nélkül kompatibilitás a meglévő kódot. Tudja meg, hogy e változások hogyan működnek együtt, valamint olvassa el a mellékelt 8. cikk Java konkurencia alapokat. amely leírja a használatát lambda kifejezések m. n. Java 8 folyamok (stream).
Denis Sosnoski. Tanácsadó, Sosnoski Software Solutions, Inc.
Denis Sosnoski (Dennis Sosnoski) - alapítója és vezető a Java technológia tanácsadó cég szakértője - Sosnoski Software Solutions, Inc. szakosodott képzés és tanácsadás kérdésekben az XML és web-szolgáltatásokat. Már több mint 30 éves tapasztalattal rendelkezik a szakmai szoftverfejlesztés, szakterülete a szerver oldali XML és a Java-technológiát. Dennis a vezető fejlesztő a nyílt forráskódú JiBX XML Data Binding. épül alapján a Java osztály technológiák és kapcsolódó JibxSoap Web-szolgáltatások keretet. valamint az Apache Axis2 Web-szolgáltatások keretet. Ő is az egyik szakértő a fejlesztés JAX-WS 2.0 specifikáció.
A legnagyobb változás a Java 8 - a mellett támogatja az úgynevezett .. lambda kifejezéseket. Lambda kifejezések kód blokkokat átadható hivatkozunk. Ezek hasonlóak a bezárások (lezárás) valamilyen más programozási nyelvek: a kód, amely megvalósítja a funkció adott elfogadja egy vagy több bemeneti paraméterek és adott értékkel tér vissza az eredményt. Lezárások összefüggésben meghatározott, illetve hozzáférhet (abban az esetben, lambda kifejezések - csak olvasható hozzáférést), hogy az értékeket ebben az összefüggésben.
Ha Ön nem ismeri a bezárások, ez rendben van. Lambdas Java 8 - valójában Szakterület névtelen belső osztályok, melyek jelzik, szinte minden Java-fejlesztő. Névtelen belső osztályok nyújt a beépített végrehajtása a felület, vagy alosztályba az alap osztály, amely a használni kívánt egyetlen pontja a program kódját. Lambda kifejezések használata ugyanúgy, de a rövidített szintaxist, ami számukra még kompaktabb, mint a normál felbontású a belső osztály.
Ebben a cikkben látni fogja, hogyan kell használni a lambda kifejezések különböző helyzetekben, és megismerhetik a kapcsolódó kibővített definíció felület Java nyelven. A kísérő cikk 8 Java szálak alapjai JVM konkurencia ciklus további példát arra, hogyan lambda kifejezések, beleértve azok kombinált használatra t. N. Java 8 folyamok (stream).
A koncepció a lambda kifejezések
Lambda kifejezés mindig a felismerés, hogy a Java 8 terminológia nevezik funkcionális felület. Class kezelőfelület. definiál egy absztrakt módszer. Felhasználásának korlátozása nem több, mint egy absztrakt módszer azért fontos, mert a lambda kifejezésszintaktikai nem használja a módszer neve. Ehelyett, a kifejezés használ t. N. kacsa tipizálás (kacsa gépelés - megfelelő paraméterek típusa és visszaadott érték, ahogy az sok dinamikus nyelvek) annak biztosítása, hogy a rendelkezés a lambda kifejezés összhangban van a várt interface módszer.
1. lista összehasonlítása lambdas és névtelen belső osztály
1. lista lambda kifejezést használják a helyett a hagyományos névtelen belső osztályok. Ez a fajta a hagyományos belső osztály nagyon gyakori a gyakorlatban, ezért lambda kifejezéseket biztosítja az azonnali győztes Java programozók 8 (ebben az esetben a munka elvégzésére képest, és belső osztályok és lambda kifejezés azt a módszert használja végre a neve osztályban. Ha a módszer kód compareTo () inszertáltuk a lambda expressziós, a kifejezés kevésbé tömör).
Szabványos interfészek funkcionális
- Funkció: Elfogadja egyetlen érv, olyan eredményt ad vissza alapuló paraméter értékét.
- Állítmány: Elfogadja egyetlen érv, visszatér egy logikai eredmény alapján paraméter értékét.
- BiFunction: két paramétert, olyan eredményt ad vissza alapuló paraméter értékét.
- Szállító: nem vesz paraméterek visszaadja az eredményt.
- Fogyasztó: Elfogadja egyetlen érv, visszaadja az eredményt (void)
2. lista A kombináció predikátumok
A 2. listában, a kód határozza meg, kétféle konstrukció Predicate
A Java 8 meghatározza számos hasznos felületek java.util.function kombinációi, de ezek a kombinációk nem következetes. Minden variációját az állítmány (DoublePredicate. IntPredicate. LongPredicate és Predicate
Változások a felületen osztályok
A megváltozott szerkezettel 8 Java osztály interfész (mint például a komparátor. 1. példában alkalmazott), részben, hogy egyszerűsítse a használatát lambda kifejezéseket. Korábbi verzióit Java 8 felület lehetővé teszi, hogy meghatározza csak állandók és absztrakt metódusok, amelyet aztán be kellett vezetniük. A Java 8 növeli a képességet, hogy meghatározza felületek statikus módszer és az alapértelmezett -methods. Statikus-módszerek a felületen - ez lényegében ugyanaz, mint a statikus-módszerek az absztrakt osztály. Default-módszerek inkább a felület módszerek a régi stílusú, de az általuk nyújtott végrehajtási, hogy használják az esetben, ha a fejlesztő nem felülbírálja az alapértelmezett módszer.
Az egyik fontos jellemzője, hogy az alapértelmezett mód az, hogy ki lehet egészíteni a meglévő osztály interface feláldozása nélkül kompatibilitás más kód, amely ezt a felületet (feltéve, hogy a meglévő kód nem ugyanazt a módszert használja neve bármilyen más célra) . Ez egy nagyon erőteljes funkció; Java8 tervezők arra használta, hogy „finomhangolása” támogatási lambda kifejezéseket sok meglévő Java-könyvtárak. A 3. lista a megfelelő példa - formájában egy harmadik módszer válogatás nevek adunk a kódot 1. lista.
3. lista kötődése a lánc összehasonlító alapján kifejezések kulcs-elszívó
A kód 3. lista első alkalmazása az új módszer, a statikus Comparator.comparing (), hogy a komparátor alapuló fejlesztő meghatározott lambdas kulcs-kitermelés (technikai értelemben lambda kulcs-extrakció egy példánya az interfész java.util.function.Function
Lehet, hogy az a benyomásom, hogy az a lehetőség, hogy beillesztik a következő összehasonlító-design:
Sajnos, ez a kialakítás nem működik egy interfész, mint a Java 8. Meg kell adnia a fordító több információt a várható eredmény típusa a statikus módszer - bármilyen formája a következők:
Az első forma egészíti típusú lambda paraméter a lambda kifejezés: (Név name1) -> name1.lastName. Segítségével a fordító képes megérteni a többi, mit kell tennie. A második forma a fordító típusú T és R funkcionális interfész (amely ebben az esetben felhasználásával van megvalósítva lambdas) át a összehasonlítjuk () módszer.
Az a képesség, hogy könnyen design a komparátor, és köti őket egy lánc - ez egy nagyon hasznos funkció a Java 8, de ez megvalósul árán tovább növeli a nehézségi szintet. Java-7 komparátor interfész meghatározza két módszer (A hasonlítson () módszer és a mindenütt jelen levő egyenlő () módszer. Ez garantált definiáljuk minden objektum). Java Version 8 meghatározza 18. módszerekkel (két eredeti módszer, plusz 9 új statikus-módszerek és 7 új alapértelmezett módszer). Látni fogja, hogy ez a modell egy nagyszabású infláció felületek megmunkálására lambda kifejezéseket ismétlődik egy nagy része a Java standard könyvtár.
A létező módszerek lambda kifejezések
4. lista használata létező módszerek lambda kifejezéseket
A kód a 4. listában nem ugyanaz, hogy a kódot a 3. listában, de a meglévő módszerekkel. Használhatja a meglévő Java 8 szintaktikai hivatkozások eljárás ClassName :: methodName. használni minden olyan módszer ugyanúgy, mintha egy lambda kifejezés. Az eredmény az lesz pontosan ugyanaz, mint abban az esetben meghatározó lambda kifejezés, amely előhívja ezt a módszert. Akkor használja a linkeket a módszer a statikus módszerekkel, például-eljárásokban adott tárgy vagy, mint egy bemeneti típusú lambda kifejezéseket (amint azt a 4. lista, ahol getFirstName () és getLastName () - a példány-típusú módszerek összehasonlítandó neve), és a tervezők.
Ahhoz, hogy az korlátozások a típusú „hatékony végső”, néhány megoldásokat lehet használni. Például, hogy csak az aktuális értékeket az egyes változók a lambda kifejezés, akkor adjunk hozzá egy új módszert, amely azon a paraméterként, és visszaad egy lambda kifejezés (formájában megfelelő hivatkozások az interface) a befogott (Rögzített) értékeket. Ha meg akarjuk változtatni a lambda-értéket a környező összefüggésben akkor csomagolja a megfelelő érték formájában, amely lehetővé teszi változtatásokat a tulajdonos (birtokos).
Lambda kifejezés - mi folyik a színfalak mögött
Lambda kifejezések nagyon hasonlítanak a névtelen belső osztályok, de végre másképp. Belső Java-osztályok - ez terjedelmes tervezése; nyúlnak szintig a bytecode, és minden belső osztály van egy külön osztály fájlt. Sok a megkettőzött adatok (főként az állandó medence bejegyzés), és az osztály betöltése hozzáteszi jelentős költségeket a színpadra a végrehajtás - az összes eredményeként hozzá egy kis kódot.
Ahelyett, hogy a lambda kifejezéseket külön osztályt fájl verziója a Java 8 alapul invokedynamic bytecode-utasításokat. Hozzáadott verzió Java 7. utasítás invokedynamic összpontosított bootstrap módszer, amely viszont megteremti a megvalósítása lambda kifejezések az első hívást az ezzel a módszerrel. Ezt követően, a közvetlen kihívást jelent a végrehajtás a visszatérés. Ezzel elkerülhető a felső tér által fogyasztott egy külön fájlban az egyes osztályok, és nagy része a felső a végrehajtás szakaszában okoz osztály betöltése. Ugyanígy a megvalósítása a funkciója lambda késlekedik, amíg az idő a bootstrap. Bootstrap-kód éppen generált Java 8 gyűjti a szakaszában végrehajtását egy új osztályt a lambda kifejezés, de a jövőbeni megvalósítások is lehet használni más megközelítéseket.
Java Version 8 magában optimalizálási eszközöket, amelyek segítségével a megvalósítása lambda kifejezéseket invokedynamic használati jól működik a gyakorlatban. A legtöbb egyéb JVM-nyelven, köztük Scala (2.10.x) használ belső osztályok a fordító által generált fedelezésre. A későbbi verziók ezen nyelvek, valószínűleg költözik alapuló megközelítés utasítást invokedynamic használati optimalizálási eszközök által kínált Java 8-as verzió (és újabb verziók).
Korlátozások lambda kifejezések
Mint korábban említettük, ebben a cikkben, lambda kifejezéseket mindig megvalósítások egy adott funkcionális felület. Lambda kifejezések csak telt el, mint a referencia, hogy a felület; mint abban az esetben más megvalósítások az interfész, lambda kifejezés csak a specifikus interfésszel lehet használni, amelyre azt létre. A kód az 5. lista ábra egy pár azonos restrikciós (kivéve nevek) funkcionális kapcsolódási pontok. 8 Java fordító elfogadja az eljárás string :: hosszúságú lambda-megvalósítás mindkét interfészek. Azonban, ha a lambda expressziós úgy definiáljuk, mint egy példány az első felületen, akkor már nem lehet használni, mint egy második interfészt példány.
5. lista Korlátozások lambda kifejezéseket
Az itt látható kódot az 5. lista nem meglepő, hogy bárki, aki azt hiszi szempontjából a Java-felület, mert mindig is így Java-interfészek (kivéve egy dolgot - utalás a módszereket, amelyek megjelentek a Java verziót 8). Azonban a fejlesztők, akik dolgoztak a funkcionális programozási nyelvek, mint a Scala, tekinthetik, mint egy korlátozott felület nem túl világos, intuitív szinten.
A funkcionális programozási nyelveket használnak, hogy meghatározzák a változók nem interfészek és típusú funkciók. Általánossá nyelvek dolgozni t. N. Magasabb rendű funkciók - a függvények továbbítja funkció paraméterként vagy függvény visszatérési értéke egy. Az eredmény egy sokkal rugalmasabb programozási stílusban, mint abban az esetben, lambda kifejezések, beleértve a képességét, hogy bizonyos funkciókat, mint építőelemek előállítására egyéb funkciókat. Java verzió 8 nem határozza meg, hogy milyen típusú feladatok, így nem lehet a lambda kifejezéseket ezen a módon. Lehet interfészek (lásd. 3. listát), de csak a kódot írt, hogy működjön együtt speciális interfészek részt. Egy új java.util.function csak 43 csomag interfész konfigurálva kifejezetten a lambda kifejezéseket. Mivel a több száz korábbi felületek is azt mondta, hogy a lista a módszereket, amelyek segítségével teheti interfészek mindig szigorúan korlátozott.
Választó felhasználása helyett összeadás interfészek Java típusú funkciók szándékos volt. Ez kiküszöböli a szükségességét, hogy jelentős változtatásokat a Java-könyvtárak, és lehetővé teszi a használatát lambda kifejezéseket a meglévő könyvtárak. A hátránya ennek a módszernek, hogy korlátozza a Java 8 úgynevezett „programozási felület” vagy funkcionálisan hasonló programozás - ahelyett, hogy a valódi funkcionális programozás. Jelenléte azonban számos más nyelven is elérhetők a JVM platform (beleértve a funkcionális), jelentősen gyengíti ezt a korlátozást.
következtetés
Lambda kifejezések nagyon jelentős bővülése a Java nyelvet. Mint a többi ugyanilyen jelentős bővülése - utalás a módszerek - akkor gyorsan nélkülözhetetlen eszközévé vált az összes Java-fejlesztők - például a transzfer az alkalmazások a Java platform 8. Lambda kifejezések különösen hasznosak együtt úgynevezett .. Java 8 folyamok (stream). A cikk JVM konkurencia: Java konkurencia alapjai 8. ábra megosztását lambda kifejezéseket és patakok egyszerűsítése párhuzamos programozás és javítja az alkalmazások teljesítményét.
Get termékek és technológiák
- Csatlakozz a developerWorks közösség. Csatlakozás más developerWorksön felhasználó és megismerkedhetnek a fejlesztői fórumokat, blogokat, csoportok és wikik források.