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.