A Java 8 újdonságai

Interfészek

Funkcionális interfészek

Rengeteg funkcionális interfészt ismerhetünk már korábbról, viszont nem feltétlen tudtuk, hogy ezek funkcionális interéfszek.

Funkcionális interfésznek nevezzük azokat az interfészeket, amelyeknek csak egyetlen egy metódusa van.

Példának említhetjük a már swingben sokszor használt ActionListener interfész, ami a következőképpen néz ki:

public interface ActionListener extends EventListener { public void actionPerformed(ActionEvent event); }
Ugye ennek az interfésznek egyetlen egy metódusa van, az actionPerformed, ezért az ActionListener interfész egy funkcionális interfész.

Amiért erről beszélni kell, az az, hogy mi is tudjunk olyan metódusokat definiálni, amelyeknek átadhatók lambda-kifejezések. Tehát, ha írunk egy olyan metódust, aminek egy olyan interfész a paramétere, ami funkcionális interfész, akkor a metódus paraméterének megadhatunk minden további nélkül egy lambda-kifejezést.

default kulcsszó

A Java 8-ban be lett vezetve egy default kulcsszó, ami egy interfész metódusaira van hatással.

Nézzük csak a korábban bemutatott Stream API-t. Láthattuk, hogy a Collection interfész deklarálja a stream() metódust, így minden Collection interfészt implementáló osztálynak a stream() metódust is implementálnia kell. Mi ezzel a probléma?

Ugye a Java 8 erőssége a visszafelé kompatibilitás megőrzése és ezt a Java 8 kiadtával sem akarták megtörni. Tehát gondoljunk bele, hogy van egy osztálykönyvtár, ami egy Java 8 előtti verzióval lett lefordítva, majd ezt használni szeretnénk egy Java 8-at használó projektben. Az osztálykönyvtárban használt Collection-t implementáló osztályoknak még fogalmuk sincs arról, hogy van egy stream() metódus Java 8-ban, ezért teljesen összekavarodna minden.

Hogy ezt a problémát kiküszöböljük, a Java 8 fejlesztői bevezették a default kulcsszót. Lényegében azt csinálja, hogy a default kulcsszóval megjelölt metódusnak írhatunk egy alapértelmezett implementációt. Érthetőbben úgy kell rá gondolni, hogy "ha neked nincs implementálva a default kulcsszóval megjelölt metódus, sebaj, odaadom az alapértelmezett implementációt, és használd ezt". Így megmaradt a visszafelé kompatibilitás.

Példa a stream() metódusra a Collection interfészben:

public interface Collection extends Iterable { public default Stream stream() { //alapételmezett implementáció } }