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?

mdo
fuente
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:

507

Por supuesto.

.orElseThrow(() -> new MyException(someArgument))
Louis Wasserman
fuente
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.

Manu
fuente
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"));
Ashish Pushp
fuente
recibo el error "El método orElseThrow (Proveedor <? extiende X>) en el tipo Opcional <QueryEntities> no es aplicable para los argumentos (() -> {})"
BdEngineer