Références de méthode Java 8: fournir un fournisseur capable de fournir un résultat paramétré

259

Je voudrais utiliser

java.util.Optional.orElseThrow()

avec un type Exception qui demande un paramètre constructeur. Quelque chose comme ça:

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

Existe-t-il un moyen de créer un fournisseur qui transmet la valeur de mon argument?

mdo
la source
43
Pourquoi tu ne peux pas orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström
6
Programmeur Java professionnel avec de nombreux flux et une expérience optionnelle… Je me retrouve toujours ici parfois. Et c'est pourquoi je préfère Kotlin.
Drew Stephens

Réponses:

507

Sûr.

.orElseThrow(() -> new MyException(someArgument))
Louis Wasserman
la source
22

Il semble que vous ne pouvez lever que RuntimeException à partir de la méthode orElseThrow. Sinon, vous obtiendrez un message d'erreur comme MyException cannot be converted to java.lang.RuntimeException

Mise à jour : - C'était un problème avec une ancienne version de JDK. Je ne vois pas ce problème avec les dernières versions.

Manu
la source
1
merci, cela me décourageait lors de l'utilisation Optionalen groovy. Essayer à throw Exceptionpartir d'une fermeture groovy, mais il a échoué avec java.lang.reflect.UndeclaredThrowableException, le changeant en un RuntimeExceptionfixe.
Ted Naleid
Bon à savoir à ce sujet. Heureusement dans mon cas, j'utilise RuntimeExceptions, mais ce n'est pas toujours le cas.
hbobenicio
Incorrect selon la documentation de la classe pour Optional.orElseThrowlaquelle dit que vous pouvez lancer un Throwablequi signifie un Errorou n'importe quel Exception.
Basil Bourque
Je pense que c'était un problème avec une ancienne version de JDK 8.
Manu
@Manu Vous faites peut-être référence au JDK-8047338 discuté sur cette question, lancez RuntimeException dans Stream avec Optional.orElseThrow . Si oui, incluez dans votre réponse. Je n'ai pas eu assez de café pour savoir si c'est parfait ou non, alors je m'abstiendrai de modifier moi-même votre réponse.
Basil Bourque
10
optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));
Ashish Pushp
la source
j'obtiens l'erreur "La méthode orElseThrow (Supplier <? extend X>) dans le type Facultatif <QueryEntities> ne s'applique pas aux arguments (() -> {})"
BdEngineer