Referências ao método Java 8: forneça um fornecedor capaz de fornecer um resultado parametrizado


259

Eu gostaria de usar

java.util.Optional.orElseThrow()

com um tipo de exceção que solicita um parâmetro construtor. Algo assim:

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

Existe uma maneira de criar um fornecedor que transmita meu valor de argumento?


43
Por que você não pode fazer orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström

6
Programador Java profissional com muitos streams e experiência opcional ... Eu ainda acabo aqui às vezes. E é por isso que eu prefiro Kotlin.
Drew Stephens

Respostas:



22

Parece que você pode jogar única RuntimeException do método orElseThrow. Caso contrário, você receberá uma mensagem de erro como MyException cannot be converted to java.lang.RuntimeException

Atualização : - Esse era um problema com uma versão mais antiga do JDK. Não vejo esse problema nas versões mais recentes.


1
obrigado, isso estava me excitando ao usar o Optionalgroovy. Tentando a throw Exceptionpartir de um fechamento groovy, mas falhou java.lang.reflect.UndeclaredThrowableException, alterando para um RuntimeExceptionfixo.
precisa saber é o seguinte

É bom saber sobre isso. Felizmente, no meu caso, estou usando RuntimeExceptions, mas isso nem sempre pode ser o caso.
hbobenicio 25/07

Incorreto de acordo com a documentação da classe para a Optional.orElseThrowqual diz que você pode lançar um Throwableque significa um Errorou qualquer Exception.
Basil Bourque

Eu acho que isso foi um problema com uma versão mais antiga do JDK 8.
Manu

@Manu Talvez você esteja se referindo ao JDK-8047338 discutido nesta pergunta, Throw RuntimeException dentro do Stream com Optional.orElseThrow . Se sim, inclua na sua resposta. Eu não tomei café suficiente para discernir se isso é certo ou não, por isso evitarei editar a sua resposta.
Basil Bourque

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

Estou recebendo o erro "O método orElseThrow (Supplier <? extends X>) do tipo Optional <QueryEntities> não é aplicável aos argumentos (() -> {})"
BdEngineer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.