Referencias de métodos Java 8: proporcionar un proveedor capaz de proporcionar un resultado parametrizado


259

Me gustaria usar

java.util.Optional.orElseThrow()

con un tipo de excepción que solicita un parámetro constructor. Algo como esto:

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

¿Hay alguna manera de crear un Proveedor que pase el valor de mi argumento?


43
¿Por qué no puedes hacer orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström

66
Programador profesional de Java con muchas transmisiones y experiencia opcional ... Todavía termino aquí a veces. Y es por eso que prefiero Kotlin.
Drew Stephens

Respuestas:



22

Parece que solo puede lanzar RuntimeException del método orElseThrow. De lo contrario, recibirá un mensaje de error como MyException cannot be converted to java.lang.RuntimeException

Actualización : - Este era un problema con una versión anterior de JDK. No veo este problema con las últimas versiones.


1
gracias, esto me estaba sacudiendo cuando lo uso Optionalen groovy. Intentando throw Exceptiondesde un cierre maravilloso, pero falló java.lang.reflect.UndeclaredThrowableException, cambiando a un RuntimeExceptionfijo.
Ted Naleid

Es bueno saber sobre eso. Afortunadamente en mi caso, estoy usando RuntimeExceptions, pero esto puede no ser siempre el caso.
hbobenicio

Incorrecto de acuerdo con la documentación de la clase para la Optional.orElseThrowcual dice que puede lanzar un Throwableque significa uno Erroro cualquiera Exception.
Basil Bourque

Creo que esto fue un problema con una versión anterior de JDK 8.
Manu

@Manu Quizás se esté refiriendo a JDK-8047338 discutido en esta pregunta, Throw RuntimeException dentro de Stream con Optional.orElseThrow . Si es así, inclúyalo en su respuesta. No he tenido suficiente café para discernir si esto es correcto o no, por lo que me abstendré de editar su respuesta.
Basil Bourque

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

recibo el error "El método orElseThrow (Proveedor <? extiende X>) en el tipo Opcional <QueryEntities> no es aplicable para los argumentos (() -> {})"
BdEngineer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.