Pracowałem z nowym typem opcjonalnym w Javie 8 i natknąłem się na coś, co wygląda na typową operację, która nie jest obsługiwana funkcjonalnie: „orElseOptional”
Rozważ następujący wzór:
Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
Optional<Result> resultFromServiceB = serviceB(args);
if (resultFromServiceB.isPresent) return resultFromServiceB;
else return serviceC(args);
}
Istnieje wiele form tego wzorca, ale sprowadza się on do chęci użycia „orElse” na opcji, która przyjmuje funkcję produkującą nową opcję, wywoływaną tylko wtedy, gdy bieżąca nie istnieje.
Jego implementacja wyglądałaby tak:
public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
return value != null ? this : other.get();
}
Ciekaw jestem, czy istnieje powód, dla którego taka metoda nie istnieje, czy po prostu używam Optional w niezamierzony sposób i jakie inne sposoby wymyślili ludzie, aby poradzić sobie z tym przypadkiem.
Powinienem powiedzieć, że uważam, że rozwiązania obejmujące niestandardowe klasy / metody narzędziowe nie są eleganckie, ponieważ ludzie pracujący z moim kodem niekoniecznie wiedzą, że istnieją.
Poza tym, jeśli ktoś wie, czy taka metoda zostanie uwzględniona w JDK 9 i gdzie mogę zaproponować taką metodę? Wydaje mi się to dość rażącym pominięciem API.
orElseGet()
to, czego potrzebuje OP, ale nie generuje ładnej kaskadowej składni.