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:
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.
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: