Odniesienia do metody Java 8: podaj dostawcę zdolnego do dostarczenia sparametryzowanego wyniku


259

Chciałbym użyć

java.util.Optional.orElseThrow()

z typem wyjątku, który prosi o parametr konstruktora. Coś takiego:

.orElseThrow(MyException::new(someArgument)) // obviously NOT working

Czy istnieje sposób utworzenia dostawcy, który przekazuje moją wartość argumentu?


43
Dlaczego nie możesz orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström,

6
Profesjonalny programista Java z dużą ilością strumieni i Opcjonalnym doświadczeniem… Nadal czasem tu kończę. I dlatego wolę Kotlin.
Drew Stephens

Odpowiedzi:



22

Wygląda na to, że z metody można wyrzucić tylko wyjątek RuntimeException orElseThrow. W przeciwnym razie pojawi się komunikat o błędzie, taki jak MyException cannot be converted to java.lang.RuntimeException

Aktualizacja : - To był problem ze starszą wersją JDK. Nie widzę tego problemu w najnowszych wersjach.


1
dzięki, to mnie wyrzucało, gdy Optionalużywałem w groovy. Próbowałem throw Exceptionz groovy zamknięcia, ale nie udało się java.lang.reflect.UndeclaredThrowableException, zmieniając na RuntimeExceptionnaprawione.
Ted Naleid

Dobrze o tym wiedzieć. Na szczęście w moim przypadku używam wyjątków RuntimeExceptions, ale nie zawsze tak jest.
hbobenicio

Niepoprawnie, zgodnie z dokumentacją klasy, dla Optional.orElseThrowktórej stwierdzono, że możesz rzucić Throwableco oznacza a Errorlub dowolne Exception.
Basil Bourque

Myślę, że był to problem ze starszą wersją JDK 8.
Manu,

@Manu Być może masz na myśli JDK-8047338 omawiany w tym pytaniu: Rzuć wyjątek RuntimeException w strumieniu za pomocą Optional.orElseThrow . Jeśli tak, podaj w swojej odpowiedzi. Nie miałem dość kawy, żeby rozróżnić, czy jest to trafne, czy też nie, więc powstrzymam się od edytowania odpowiedzi.
Basil Bourque,

10
optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));

dostaję błąd „Metoda orElseThrow (Dostawca <? rozszerza X>) w typie Opcjonalnie <QueryEntities> nie ma zastosowania do argumentów (() -> {})”
BdEngineer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.