W Java Optional weszło w wersji 8. Lecz Java 9 nadała mu najbardziej użyteczne API. Kosmetyczne zmiany zostały też nadane w wersji 11.
Dwie kluczowe cechy Java Optional
Przede wszystkim Optional ma nas chronić przed otrzymaniem wartości NULL. Może zaistnieć to w przypadku kiedy próbujemy się odwołać do elementu (np. w kolekcji), który nie istnieje.
Podobnie ogromną korzyścią wynikającą ze stosowania Optional jest bogate API, dzięki któremu w elegancki sposób, możemy obsłużyć brak zasobu.
Dokumentacja Oracle
Jeśli chcesz korzystać z zasobów Oracla, do nauki tego zagadnienia, to koniecznie korzystaj z najnowszej dokumentacji dla Java 11. Dlatego tu podaje Ci właściwy link – click!
W zawiązku z tym, że dokumentacja mało tłumaczy toteż w tym artykule przedstawię najczęściej wykorzystane przykłady.
Kiedy Optional uratuje Ci skórę?
Załóżmy, że mamy w kodzie kolekcje 5-cio elementową książek. Następnie otrzymujemy żądanie, które próbuje się odwołać do elementu, który nie istnieje na liście:
books.get(10);
Wówczas, taka akcja kończy się błędem – a przecież można ładnie ja obsłużyć. Z pewnością to zapewnia nam właśnie Optional.
Przykłady stosowania Optional w Java
Po pierwsze kod startowy – poligon w ramach którego będziemy realizować późniejsze przypadki. Przede wszystkim mamy w nim listę 3 książek. Natomiast książka składa się z tytułu i nr ISBN.
public class BasicExample { private List<Book> books; public BasicExample() { init(); Optional<Book> book = books.stream().filter(element -> element.getTitle().equals("Książka Spring Boot 2")).findFirst(); } private void init() { books = new ArrayList<>(); books.add(new Book("Książka Spring Boot 2", "9782123456803")); books.add(new Book("Aplikcje internetowe", "9782123456803")); books.add(new Book("Java dla zaawansowanych", "9782123456803")); } public static void main(String[] args) { new BasicExample(); } }
W rezultacie linijki 7 otrzymujemy typ zwrotny jakim jest:
Opcional<book> book;
A zatem możemy wykonać kolejne przypadki pochodzące z klasy Opcional.
Przykład 1 – ifPresent
Który wykonuje akcję zdefiniowaną w ramach interfejsu funkcyjnego w przypadku kiedy dany element istnieje. Więc w tym przypadku wypiszę zawartość:
book.ifPresent(System.out::println
Przykład 2 – ifPresentOrElse
Która dodatkowo w drugim parametrze przyjmuje akcje, która ma się wykonać w przypadku nieznalezienia danego elementu:
book.ifPresentOrElse( System.out::println, ()-> System.out.println("book doesn't exist"));
Przykład 3 – orElseThrow
W przypadku nieznalezienia danego nieznalezienia można również rzucić komunikat o błędzie:
Book book1 = book.orElseThrow( () -> new RuntimeException("book doesn't exist"));
Przykład 4 – orElseGet
Jeśli dany element istnieje, to go zwróci. Natomiast w przypadku jego braku zwróci element, który został zdefiniowany w ramach interfejsu funkcyjnego:
book.orElseGet( () -> new Book("Spring w akcji", "9782123226803"));
Podsumowując powyższe cztery przykłady są najczęstszymi przykładami zastosowania Optional i warto je znać 🙂
Optional w pigułce
Jeśli interesuje Cię lakoniczny wykład na temat tego czym jest Optional oraz jakie zastosowanie znajduje on w Java i Spring Boot, to zapraszam Cię do obrzezania materiału: