Java 8 je veľký balíček novej funkcionality oproti Java 9 a java 10. Tie sú menšie a odzrkadľujú taktiku tvorcov javy vydávať nové verzie častejšie s menším balíkom novej funkcionality. V tomto článku si povieme najvýraznejšie zmeny z Java 8.
Funkcionálne rozhrania
Rozhranie, ktoré má len jednu abstraktnú metódu je považované za funkcionálne rozhranie. Pre lepšie načrtnutie v kóde môžeme a je odporúčané pridať anotáciu @FunctionalInterface.
import java.lang.FunctionalInterface;
@FunctionalInterface public interface FunctionalInterfaceExample { void print(); }
Lambda výrazy
Ok, chceme pridať do javy možnosť definovať funkcionalitu bez toho aby patrila špecificky pod nejakú triedu. Tieto funkcie chceme vkladať do metód ako parametre. Čo spravíme? Tvorcovia javy sa asi takto nezamýšľali, ale my sme sa takto zamysleli a odpoveď je – použijeme lambda výrazy.
Každá lambda má ako typ funkcionálne rozhranie s jej odpovedajúcou metódou. V príklade vyššie máme rozhranie s metódou print. Táto metóda nevracia nič a neprijíma žiadne parametre. Musíme vytvoriť aj taký lambda výraz – teda nebude obsahovať return a nebudeme mať žiadne návratové hodnoty.
() -> System.out.println("Hello Word")
Takto vložíš lambda výraz do metódy:
printHelloWord(() -> System.out.println("Hello Word"));
Samotná metóda prijíma na vstupe práve dané funkcionálne rozhranie:
public void printHelloWord2(FunctionalInterfaceExample printHello)
Viac o lambda výrazoch sa dozvieš z môjho online kurzu
Java pre pokročilých, videá o lambda výrazoch sú zadarmo.
Streams
Streamy poskytujú zjednodušenú prácu s dátovými kolekciami. Poskytujú viacero užitočných metód ako sú napríklad filter, sorted, map a iné. Ak stream préjde cez všetky elementy v kolekcii, tak bude prázdny. Teda ak chcem znovu použiť ten istý stream, tak zbytočne, lebo tam už nebudú dáta. Musíš si vytvoriť nový stream.
Nový stream vytvoríš napríklad pomocou stream metódy nad kolekciami.
List<Osoba> osoby = Arrays.asList(
null,
new Osoba("Jaro", "Beno", 30),
new Osoba("Peter", "Kridlo", 55),
new Osoba("Karol", "Otko", 18),
new Osoba("Karol", "Beno", 18),
new Osoba("Peter", "Otko", 20),
new Osoba("Fedor", "Ronald", 84)
);
osoby.stream();
Máš zoznam osôb a chceš z daného zoznamu získať všetky veky osôb starších ako 50 rokov a majú byť zoradené podľa veku. Čo spravíš? Použiješ stream a jeho metódy – tieto metódy akceptujú funkcionálne rozhrania, teda tam dáš lambda výrazy.
List<Integer> veky = osoby.stream()
.filter(osoba -> osoba.getVek() < 50)
.sorted(Comparator.comparing(Osoba::getVek))
.map(Osoba::getVek)
.collect(Collectors.toList());
Kolekcie, ktoré sú iterovateľné, majú metódu forEach – ktorá získa stream a prejde všetky elementy.
veky.forEach(System.out::println);
Method reference
Po slovensky referencia na metódu. Všimni si príklad z hora: Osoba::getVek. Znamená to, že z triedy Osoba použi metódu getVek. To isté sa dá zapísať aj pomocou lambda výrazu takto osoba -> osoba.getVek(). Ale pomocou referencie si to zjednodušíme lebo java vie, aký je vstupný parameter – je to osoba a vie, že voláš getVek. Tak stačí napísať Osoba::getVek. Metódu voláš bez zátvoriek.
Ďalší článok o Jave už čoskor. Prihlás sa k odberu noviniek a nezmeškaj žiadný nový blog.