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.