Java

Java Optional – jakie możliwości dostarcza w Javie 11 i Spring?

java optional

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:

Show Buttons
Hide Buttons