A Java 8 újdonságai

Szintaxis

Lambda kifejezések

Nézzük meg, hogy a Java 8 előtt milyen lehetőségünk egy swinges JButton-ra egy ActionListenert raknunk.

button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("gomb lenyomva"); } });
Ha ránézünk erre a kódrészletre, láthatjuk, hogy eléggé pazarló megoldás, mivel egy névtelen interfész implementációt kell írnunk. Ha több gombunk van, több ilyet kell írnunk, ami lássuk be elég olvashatatlan kódot eredményez, akármennyire is próbálunk figyelni erre.

Most vessünk egy pillantást a Java 8 legnagyobb újítására, a lambda-kifejezésekre. Az előző példa lambda-kifejezésekkel a következőképpen néz ki:

button.addActionListener(event -> System.out.println("gomb lenyomva"));
Lássuk be, ez sokkal szebb, olvashatóbb, és egyszerűbb megoldás, még akkor is ha az előző példának a nagy részét az IDE kigenerálja nekünk. Nézzük meg, hogy mit csinál ez a kód.

Ahelyett, hogy egy interfész implementációt adnánk át az addActionListener metódusnak, semmi ilyet nem teszünk, helyette egy kódrészletet adunk át neki. A lambda-kifejezés bal oldala a metódusnak a paramétere (a paraméter neve mindegy, hogy mi). A jobb oldal pedig az a kód, amit a Java lefuttat, ha bekövetkezik az adott esemény.

A másik nagyon fontos dolog, - amit már egyébként láthattunk a Java 7 esetében - az a típus kikövetkeztetés (type inference). A példában látható, hogy a kifejezés bal oldalára nem írtam típust, ez a type inference miatt van.

Metódus referenciák

Vegyünk egy új példát. Az ismeretlen metódusok ne tévesszenek meg senkit, a későbbiekben bemutatásra fognak kerülni.

List list = new ArrayList<>(); //lista feltöltése List stringList = list.stream().map(i -> i.toString()).collect(Collectors.toList());

A példában veszünk egy listát ami számokkal van feltöltve. Ezután a számértékeket stringként akarjuk használni egy új listában. A lényegi rész a metódusreferenciákra vonatkozóan a következő:

map(i -> i.toString())

Itt jönnek be a metódusreferencia használata. Mennyivel olvashatóbb lenne, ha olyan szintaxisban nézne ki az i.toString() hívás, hogy tudjuk milyen osztály, milyen metódusát hívjuk.

A metódusreferencia szintaxisa a következőképpen néz ki:

Classname::methodName

Az előző példa metódusreferenciával:

map(i -> Integer::toString)
Figyeljük meg, hogy a metódus végén nincs zárójel, ugyanis nem meghívni akarjuk a metódust, csak egy referenciát átadni az adott metódusra.

Van néhány beépített metódusnév is, ilyen például a new. Ha egy olyan metódusreferenciát akarunk átadni, ami létrehoz egy új objektumot, akkor írhatjuk a következőt:

Classname::new