Java alkalmazások 6. Előadás.

Slides:



Advertisements
Hasonló előadás
A felhasználói interfész A felhasználói interfész az a felület, amellyel a szoftver az ember felé „fordul”; amellyel a felhasználó nap mint nap találkozik.
Advertisements

FOL függvényjelekkel Zsebibaba anyja A 2 harmadik hatványa a oszlopában az első blokk Ezek is nevek, de nem in- konstansok Azért, mert összetettek Predikátum:
TÖMÖRÍTÉS. Fogalma A tömörítés egy olyan eljárás, amelynek segítségével egy fájlból egy kisebb fájl állítható elő. A tömörítési arány függ a fájl típusától,
Bevezetés a C# nyelvbe Az alapok összefoglalása Farkas Csaba.
1 Az önértékelés mint projekt 6. előadás 1 2 Az előadás tartalmi elemei  A projekt fogalma  A projektek elemei  A projekt szervezete  Projektfázisok.
Munkalapok védelme az Excelben
DIGITÁLIS VÁSÁRLÁSOK, GENERÁCIÓS KÜLÖNBSÉGEK
Alhálózat számítás Osztályok Kezdő Kezdete Vége Alapértelmezett CIDR bitek alhálózati maszk megfelelője A /8 B
Programstruktúrák.
A Scala programozási nyelv
Microsoft Office Publisher
Java kódolási konvenciók
Scilab programozás alapjai
376/2014 EU RENDELET BEVEZETÉSÉNEK
videós team Team vezetője: Tariné Péter Judit Tagok:
Adatok importálása, rendezése és szűrése
Programozás III. Gyakorlás.
A C++ programozási nyelv
PHP - függvények.
Az integrált áramkörök (IC-k) típusai és tervezése
A mesterséges intelligencia alapjai
Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök
Becsléselmélet - Konzultáció
CSOPORT - A minőségellenőrök egy megfelelő csoportja
KERESÉS ELEKTRONIKUS KÖNYVTÁRI KATALÓGUSOKBAN
Végeselemes modellezés matematikai alapjai
C# SZINTAKTIKÁJA Az egyes utasítások végén pontosvessző áll
Lexikális elemző: lex (flex)
Dependency Injection Moq Feladat
Statisztika 10 évf. 3 osztály 82 tanuló 9 évf. 4+1 osztály 118 tanuló Minden osztályt külön pedagógus javított 8 fő - részben of, ha vállalta.
Animációk.
Programozás I. 5. gyakorlat.
Logikai programozás 2..
Nyelvek típusossága.
Adatbázis-kezelés (PL/SQL)
2. Bevezetés A programozásba
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
☺ Programozási környezetek Validátorok Fazekas Judit PTI 2010.
Adatbevitel, értékadás, típuskonverzió
Közigazgatási alapvizsga a Probono rendszerben
Algoritmusok és Adatszerkezetek I.
Körmendi Dániel MAS Meeting Scheduler.
Rendszerfejlesztés gyakorlat
Számítógépes Hálózatok
aka.ms/coauthorinword
3. A robot képernyőmenüje
Tilk Bence Konzulens: Dr. Horváth Gábor
Programozás I. 4. gyakorlat.
Csomagoló Üzemi optimalizáló és Szimulációs rendszer
Szoftverrobotok vs biorobotok Bemutatkozik Albert, a vállalati robot
Informatikai gyakorlatok 11. évfolyam
B M Java Programozás 4. Gy: Java GUI IT A N Tipper, MVC kalkulátor
Oracle Adatbázisok kezelése c#-ban
A Microsoft SharePoint testreszabása Online webhely
2. A KVANTUMMECHANIKA AXIÓMÁI
B M Java Programozás 9. Gy: Java alapok IT A N Adatkezelő 5.rész
További rendező és kereső algoritmusok
Szálszinkronizáció.
A szállítási probléma.
I. HELYZETFELMÉRÉSI SZINT FOLYAMATA 3. FEJLESZTÉSI FÁZIS 10. előadás
9-10.-es bemeneti mérések és a fejlesztő munkánk
B M Java Programozás 2. Gy: Java alapok IT A N Adatszerkezetek
Binomiális fák elmélete
Műveletek, függvények és tulajdonságaik Mátrix struktúrák:
SQL jogosultság-kezelés
Áramlástan mérés beszámoló előadás
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Informatika Oktató: Katona Péter.
Java alkalmazások 3. Előadás.
Algoritmusok.
Előadás másolata:

Java alkalmazások 6. Előadás

FELSOROLÁSI TÍPUS (ENUM) A felsorolási típus egy olyan típus, melynek megengedett értékei fix konstansokból állnak. Java-ban enum kulcsszóval definiáljuk. Példa: hét napjainak hozzunk létre egy enumerációt: Használatukkal a kódunk jobban olvashatóbb lesz, mivel könnyebben fel tudjuk ismerni ezeket a konstansokat. A Java nyelvben a felsorolási típus nem csak nevesített egész számok. Az enum deklaráció egy osztályt definiál, amelyre az alábbi tulajdonságok igazak: Beszédesebbek az egyszerű literáloknál Típusbiztosak Saját névterük van Érdemes switch-case szerkezetben felsorolási típus alapján szervezni

FELSOROLÁSI TÍPUS (ENUM) Egyéb fontos tulajdonságok: Van egy statikus values metódusuk, mely egy tömböt ad vissza, melyben a típus értékei szerepelnek deklarálási sorrendben. Ez a módszer pl. for-each ciklussal nagyon hasznos. Tartalmazhat metódusokat, adattagokat, konstansokat, implementálhat interfészeket stb. Minden Object metódust implementálnak. Összehasonlíthatók és szerializálhatók.

FELSOROLÁSI TÍPUS (ENUM) Észrevehettük, hogy az enumeráció konstruktor privát, ha publikusra állítanánk fordítási hibát kapnánk. Habár a felsorolás típusok osztályok, nem definiálható hierarchia számukra. Más szavakkal: nem lehet leszármazottja a felsorolási típusnak. Példa: egy ember Földön mért súlya alapján számoljuk ki, hogy a többi bolygón mekkora súlya van:

LAMBDA KIFEJEZÉSEK A program outputja: Java 8 legjobban várt újdonsága: lehetővé teszi a funkcionális programozást a Javában. A program outputja: public class Java8Tester { public static void main(String args[]){ Java8Tester tester = new Java8Tester(); //with type declaration MathOperation addition = (int a, int b) -> a + b; //with out type declaration MathOperation subtraction = (a, b) -> a - b; //with return statement along with curly braces MathOperation multiplication = (int a, int b) -> { return a * b; }; //without return statement and without curly braces MathOperation division = (int a, int b) -> a / b; System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); System.out.println("10 / 5 = " + tester.operate(10, 5, division)); //without parenthesis GreetingService greetService1 = message -> System.out.println("Hello " + message); //with parenthesis GreetingService greetService2 = (message) -> greetService1.sayMessage("Mahesh"); greetService2.sayMessage("Suresh"); } interface MathOperation { int operation(int a, int b); interface GreetingService { void sayMessage(String message); private int operate(int a, int b, MathOperation mathOperation){ return mathOperation.operation(a, b);

LAMBDA KIFEJEZÉSEK Más nyelvekben már korábban elérhetők voltak a lambda kifejezések (pl.: C#). Függvények definiálását és referenciaként való átadását valósíthatjuk meg vele. Korábban csak objektumok referenciáit lehetett csak továbbadni. Lambda előtti idők: Egy plusz osztályunk – amely megvalósítja a Runnable iterfészt – csak azért, hogy a run() függvényt meg tudják majd hívni. A paraméter newInstance egy objektum referencia, de valóban a run metódus hívását szolgálja, mintha egy függvény referencia lenne.

LAMBDA KIFEJEZÉSEK Sok esetben a Runnable interfész megvalósítását csak egy osztályban használjuk. Ilyenkor szokás alkalmazni egy belső anonymus definíciót. Összefoglalva: A Runnable interfész csak a run() függvényt tartalmazza. Ahhoz, hogy a run() függvényt használni tudjuk (illetve megvalósítani) egy új típust kellett létrehozunk, amely örökölt a Runnable-től. Ez csak azért kellett, mert eddig csak típust tudtunk továbbadni. A Runnable interfész csak egy burkolóként szolgál (semmi más szerepe nincs), így tudjuk a run()-t meghívni.

LAMBDA KIFEJEZÉSEK Lambda kifejezéssel: A lambda kifejezésnél a run() függvényre nem kell hivatkozni, mert az execute() egy Runnable típust vár, és tudja, hogy csak egy run() függvény található benne. A lambda kifejezés egy függvényt tartalmazó interfész megvalósítása, az interfész függvényének definíciójával. Amikor lefordul a kód ugyanazt a végeredményt kapjuk, mint a korábbi implementációknál/megoldásoknál láthattunk. Elemzés: Lambda kifejezés: executor.execute(() -> performLongRunningTask()); () a kifejezés által használt paraméterek (ugyanúgy adjuk meg mint bármely másik függvénynél, vesszővel elválasztva egymástól, ha () szerepel, akkor nincs bemenő paraméter) -> nyíl operátor, amely elválasztja a paramétereket a kifejezés törzsétől performLongRunningTask() a kifejezés törzse, a kód amelyet végre szeretnénk hajtani

LAMBDA KIFEJEZÉSEK Példa: String tömb értékeit szeretnénk sorba rendezni, amelyek csak számokat tartalmaznak, a számok nagysága szerint. A rendezéshez pedig az Arrays.sort() függvényt szeretnénk használni. Ha így hagyjuk akkor rossz sorrendet fogunk kapni, pl. a "12" előrébb lesz mint a "2". A megoldáshoz egy Comparator<T> implementációra lesz szükség, amelyben leírhatjuk hogyan kell két String-et összehasonlítani a mi esetünkben.

LAMBDA KIFEJEZÉSEK Rövidebben: Megoldás lambda kifejezéssel: A sort metódus második paraméterként a Comparator interfésznek egy megvalósítását várja. A Comparator interfésznek két metódusa van: compare és equals, de csak az első absztrakt, mert az equals neve és szignatúrája megegyezik az Object-ben definiált metódus nevével és szignatúrájával, így bármelyik a Comparator-t megvalósító osztályban definiált. Mivel csak a comparator absztrakt, csak az definiálható a lambda kifejezésben a két paramétere és a törzse megadásával. Nem szükséges megadni a paraméterek típusait, így rövidebben megadható:

LAMBDA KIFEJEZÉSEK Alapértelmezett (default) metódusok: A Java 8 egy másik újdonsága az alapértelmezett metódusok. Az alapértelmezett metódusok olyan konkrét függvények, amelyeket interfészek implementálnak, így hasonló viselkedést kaphatunk mintha absztrakt osztályokat használnánk. A default kulcsszóval jelöljük meg a függvényt, hogy alapértelmezett metódus legyen. Alapértelmezett metódusok lehetővé teszik, hogy olyan interfészek megvalósítására is lambda kifejezéseket használjunk, ahol eddig nem lehetett (pl. két függvényt tartalmaz).

LAMBDA KIFEJEZÉSEK Példa: Egy interfész, amely két függvényt tartalmaz, így nem lehet lambda kifejezéssel megvalósítani: A második metódusnak adunk egy alapértelmezett viselkedést: A default használatával egy úgynevezett „funkcionális interfészt” hozunk létre, amelyet már használhatunk lambda kifejezéssel. Egy funkcionális interfésznek egyetlen egy absztrakt metódusa van.

LAMBDA KIFEJEZÉSEK Megjegyzések: Alapértelmezett metódus definíciójával bővíthetünk egy interfészt anélkül, hogy definiálni kelljen az új metódust azokban a megvalósításokban, amelyek az új metódus bevezetése előtt készültek. Ha két interfészt valósítunk meg, amelyek tartalmaznak egy azonos nevű és szignatúrájú függvény, amely legalább az egyik interfészben alapértelmezett, akkor a megvalósításban felül kell definiálni a függvényt. Példa: Az ApplicationFacade osztály megvalósítja a ResourceController és a ApplicationManager interfészeket. Mind a két megvalósított interfészben szerepel azonos szignatúrával a deactivate() metódust, amely legalább az ApplicationManager interfészben alapértelmezett. Az ApplicationFacade osztályban felül kell definiaálnia a deactivate metódust: Az ApplicationFacade osztály az ApplicationManager interfészben definiált alapértelmezett deactivate metódust valósítja meg.

STREAM API A Stream API is a Java 8 egy újdonsága, amelynek segítségével az adatokat tudjuk szűrni, azokon transzformációkat végrehajtani, stb. Egy stream három részből áll: Adatforrás (pl.: egy lista) Közbülső műveletek, amelyből több is lehet (pl.: adatok szűrése) Végső művelet (pl.: sorba rendezés)

STREAM API Példa: Egy String-eket tartalmazó listát szeretnénk szűrni úgy, hogy egy-egy megadott kezdő és vég szöveggel rendelkezzenek. List<String> filteredList - Lokális változó, ahol majd tároljuk a végeredményt items.stream() - Stream API-val akarjuk kezelni az adatforrást filter(e -> (e.startsWith(prefix))) - Közbülső művelet, amelyben a prefix-xel kezdődő String-eket válogatjuk ki filter(e -> (e.endsWith(suffix))) - Közbülső művelet, amelyben a suffix-xel befejeződő String-eket válogatjuk ki collect(Collectors.toList()) - Végső művelet; egy új listában szeretnénk tárolni az eredményeket

STREAM API Több metódust is biztosít a Stream API. Ezekből néhány fontosabb: distinct() Az ugyanolyan elemeket kiszűri (toString() alapján), így csak különböző elemünk lesz. limit(n) Az első n db elemet engedjük tovább. skip (n) Az első n elemet elhagyjuk. A limit-tel kombinálva page-elés funkciót tudunk létrehozni. sorted() Rendezés megvalósítása.

STREAM API A Stream API rendelkezik tovább végső műveletekkel is. Ilyen például a count(): Egy másik hasznos művelet a findFirst(). A példában az első olyan elemet kapjuk vissza, amely a szűrőfeltételeknek megfelelt: A findFirst() hatására elemeken végigiterálunk addig, amíg az első egyezést meg nem találjuk.

OPTIONAL OSZTÁLY Az Optional osztály egy másik Java 8 újdonság, amely: Burkolóként működik a referencia és primitív típusokhoz. Segítségével csökkenthetjük a programunkban keletkezett NullPointerException-ök számát. Az Optional osztály isPresent() függvényével kérdezhetünk rá, hogy nem null értéket tartalmaz, illetve a get() metódussal kérdezhetjük le annak értékét. Az előző példára visszatérve: Ha nem talál elemet a Stream API null-lal tér vissza. Az Optional miatt a firstItem változó sosem lesz null értékű. Legrosszabb esetben egy olyan Optional típust kapunk vissza, amely egy null értéket burkol.

PARALLEL STREAM API Az előbbi megoldások csak egyszálú végrehajtást tesznek lehetővé. Mikor használjuk a párhuzamos végrehajtást: Ha szeretnénk használni a processzor több magját is. Nagyméretű adathalmazokon való művelet végrehajtására. A párhuzamos végrehajtás csak annyiban különbözik, hogy a stream() helyett a parallelStream() függvényt hívjuk meg. A parallelStream() előnye, hogy nem kell a párhuzamos végrehajtást nekünk végrehajtani, így kevesebb hibát tartalmaz majd a kódunk. Csak akkor érdemes használni ha tényleg sok adaton dolgozunk, különben lassabb végrehajtást kapunk mint az egyszálú esetben.

IRODALOMJEGYZÉK Nagy Gusztáv.: Java programozás v1.3, Creative Commons, Kecskemét,2007. (133 - 134) Brett Spell.: Pro Java 8 Programming, 3th, 2015. (81 - 92) 6/16/2019