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?

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

507

Certo.

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

Manu
fonte
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"));
Ashish Pushp
fonte
Estou recebendo o erro "O método orElseThrow (Supplier <? extends X>) do tipo Optional <QueryEntities> não é aplicável aos argumentos (() -> {})"
BdEngineer