Riferimenti al metodo Java 8: fornire un fornitore in grado di fornire un risultato con parametri


259

Mi piacerebbe usare

java.util.Optional.orElseThrow()

con un tipo di eccezione che richiede un parametro costruttore. Qualcosa come questo:

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

C'è un modo per creare un fornitore che trasmetta il valore del mio argomento?


43
Perché non puoi farlo orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström,

6
Programmatore Java professionale con molti stream ed esperienza opzionale ... Finisco ancora qui a volte. Ed è per questo che preferisco Kotlin.
Stephens il

Risposte:



22

Sembra che dal metodo sia possibile lanciare solo RuntimeException orElseThrow. Altrimenti riceverai un messaggio di errore simile MyException cannot be converted to java.lang.RuntimeException

Aggiornamento : - Questo era un problema con una versione precedente di JDK. Non vedo questo problema con le ultime versioni.


1
grazie, questo mi stava buttando via quando Optionalusavo in groovy. Provando throw Exceptionda una chiusura groovy, ma non ci riuscì java.lang.reflect.UndeclaredThrowableException, cambiandola in RuntimeExceptionfissa.
Ted Naleid,

Buono a sapersi. Fortunatamente nel mio caso, sto usando RuntimeExceptions, ma potrebbe non essere sempre così.
hbobenicio,

Errato secondo la documentazione della classe per la Optional.orElseThrowquale si dice che è possibile lanciare un Throwableche significa uno Erroro qualsiasi Exception.
Basil Bourque,

Penso che questo sia stato un problema con una versione precedente di JDK 8.
Manu

@Manu Forse ti riferisci a JDK-8047338 discusso su questa domanda, Lancia RuntimeException all'interno di Stream con Optional.orElseThrow . In tal caso, includi nella tua risposta. Non ho avuto abbastanza caffè per discernere se questo è perfetto o no, quindi mi trattengo dal modificare la tua risposta da solo.
Basil Bourque,

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

sto ricevendo un errore "Il metodo orElseThrow (fornitore <? estende X>) nel tipo Facoltativo <QueryEntities> non è applicabile per gli argomenti (() -> {})"
BdEngineer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.