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?

mdo
źródło
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:

507

Pewnie.

.orElseThrow(() -> new MyException(someArgument))
Louis Wasserman
źródło
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.

Manu
źródło
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"));
Ashish Pushp
źródło
dostaję błąd „Metoda orElseThrow (Dostawca <? rozszerza X>) w typie Opcjonalnie <QueryEntities> nie ma zastosowania do argumentów (() -> {})”
BdEngineer