Jak korzystać z Optionali? Rozumiem jak ich użyć w sytuacji gdy chcemy coś zmapować/stworzyć obiekt gdy optional jest pusty, ale co w sytuacji gdy w zależności od Optionala, chcemy wywołać jakąś konkretną funkcję i zwrócić inny wynik? Np gdy Optional<User> "jest obecny" to temu Userowi dodać Obiekt Foo, do ArrayList<Foo> i zwrócić ten Either z tego dodawanego obiektu. Jeżeli nie jest obecny to zwrócić Eithera z kodem błędu. Jedyny sposób jaki widzę, to sprawdzanie czy Optional.isPresent() i dodać obiekt/zwrócić kod błędu, ale coś takiego nie różni się praktycznie niczym od sprawdzania, czy obiekt jest nullem.
Chodzi Ci o cos takiego?
Dostępne od Javy 9
opt.ifPresentOrElse(
value -> System.out.println("Found: " + value),
() -> System.out.println("Not found")
);
"Jedyny sposób jaki widzę, to sprawdzanie czy Optional.isPresent() i dodać obiekt/zwrócić kod błędu, ale coś takiego nie różni się praktycznie niczym od sprawdzania, czy obiekt jest nullem."
Ustosunkuję się do tego. Różnica jest więcej niż podstawowa, jeśli Będziesz miał Optional
zamiast null
w przypadkach, normalnych dla działania programu, jak nieudany get
na jakiejś mapie, to wtedy null
będzie oznaczał prawdziwy błąd, brak jakiejś inicjalizacji, czy coś takiego; widać jak to ułatwi debugowanie null pointer exception
.
W połowie widzę, że jest wstanie to rozwiązać mój problem. Tylko co w przypadku, gdybym chciał to rozwinąć o:
opt.ifPresentOrElse(
value -> System.out.println("Found: " + value), //po wypisaniu return Either.right(value)
() -> System.out.println("Not found") // //po wypisaniu return Either.left("Not found")
);
Pytanie czy musiałbym utworzyć Eithera przed wywołaniem ifPresentOrElse i w odpowiedniej lambdzie przypisać do niego odpowiednią wartość (o ile to możliwe, na razie nie mam jak tego sprawdzić ale wydaje mi się że może sypnąć błędem "non static reference ...")? Wewnątrz lambd, nie mogę zwrócić czegoś na zewnątrz lambd tak?
Różni to się tym że Optional mówi wprost że to może być null. Jeśli metoda zwraca Optional to wszystko jasne I człowiek wie że funkcja może zwrócić pusty rezultat. No i Optional ma też różne fajne dodatkowe operacje np.
ifPresent
orElseGet
orElseThrow
map
flatMap
Standardowa biblioteka nie umożliwia operacji typu Option -> Either (chyba, może w nowszych wersjach coś jest?). Jeśli chcesz ją posiadać to polecam używanie Vavr (http://www.vavr.io/). Wtedy Twój przykład wyglądałby jak: opt.map(value -> "Found: " + value).toEither("Not found");
- zakładając użycie Option
zamiast Optional
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.