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.