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?


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:



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.


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"));

j'obtiens l'erreur "La méthode orElseThrow (Supplier <? extend X>) dans le type Facultatif <QueryEntities> ne s'applique pas aux arguments (() -> {})"
BdEngineer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.