Java 8 je velký balíček nové funkcionality oproti Java 9 a java 10. Ty jsou menší a odrážejí taktiku tvůrců jevy vydávat nové verze častěji s menším balíkem nové funkcionality. V tomto článku si řekneme nejvýraznější změny z Java 8.
Funkcionální rozhraní
Rozhraní, které má jen jednu abstraktní metodu je považováno za funkcionální rozhraní. Pro lepší nastínění v kódu můžeme a je doporučeno přidat anotaci @FunctionalInterface.
import java.lang.FunctionalInterface;
@FunctionalInterface public interface FunctionalInterfaceExample { void print(); }
Lambda výrazy
Ok, chceme přidat do jevy možnost definovat funkcionalitu, aniž by patřila specificky pod nějakou třídu. Tyto funkce chceme vkládat do metod jako parametry. Co uděláme? Tvůrci jevy se asi takhle nezamýšleli, ale my jsme se takto zamysleli a odpověď je – použijeme lambda výrazy.
Každá lambda má jako typ funkcionální rozhraní s její odpovídající metodou. V příkladu výše máme rozhraní s metodou print. Tato metoda nevrací nic a nepřijímá žádné parametry. Musíme vytvořit i takový lambda výraz – tedy nebude obsahovat return a nebudeme mít žádné návratové hodnoty.
() -> System.out.println("Hello Word")
Takto vložíš lambda výraz do metody:
printHelloWord(() -> System.out.println("Hello Word"));
Samotná metoda přijímá na vstupu právě dané funkcionální rozhraní:
public void printHelloWord2(FunctionalInterfaceExample printHello)
Více o lambda výrazech se dozvíš z mého online kurzu
Java pro pokročilé, videa o lambda výrazech jsou zdarma.
Streams
Streamy poskytují zjednodušenou práci s datovými kolekcemi. Poskytují několik užitečných metod jako jsou filtr, sorted, map a jiné. Pokud stream přejede přes všechny elementy v kolekci, tak bude prázdný. Tedy pokud chci znovu použít tentýž stream, tak zbytečně, neboť tam už nebudou data. Musíš si vytvořit nový stream.
Nový stream vytvoříš například pomocí stream metody nad kolekcemi.
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áš seznam osob a chceš z daného seznamu získat všechny věky osob starších 50 let a mají být seřazeny podle věku. Co uděláš? Použiješ stream a jeho metody – tyto metody akceptují funkcionální rozhraní, tedy 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());
Kolekce, které jsou iterovatelné, mají metodu forEach – která získá stream a projde všechny elementy.
veky.forEach(System.out::println);
Method reference
Česky reference na metodu. Všimni si příkladu shora: Osoba::getVěk. Znamená to, že ze třídy Osoba použij metodu getVek. Totéž lze zapsat i pomocí lambda výrazu takto osoba -> osoba.getVek(). Ale pomocí reference si to zjednodušíme neboť java ví, jaký je vstupní parametr – je to osoba a ví, že voláš getVek. Tak stačí napsat Osoba::getVek. Metodu voláš bez závorek.
Další článek o Javě již brzy. Přihlas se k odběru novinek a nezmeškej žádný nový blog.