Java-8 ссылка метода: обеспечивает поставщик, способный поставлять параметризованный результат


147

Я хотел бы использовать

java.util.Optional.orElseThrow() 

с типом Exception, которое запрашивает для параметра конструктора. Что-то вроде этого:

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

Есть ли способ создать поставщика, который передает значение моего аргумента?

+19

Почему вы не можете сделать 'orElseThrow (() -> новый MyException (someArgument))'? 07 апр. 142014-04-07 15:51:04

289

Несомненно. orElseThrow(() -> new MyException(someArgument)).


17

Похоже, что вы можете исключить только RuntimeException из метода orElseThrow. В противном случае вы получите сообщение об ошибке, как MyException cannot be converted to java.lang.RuntimeException

+1

спасибо, это меня отбрасывало при использовании 'Optional' в groovy. Попытка «выбросить исключение» из groovy-закрытия, но с ошибкой «java.lang.reflect.UndeclaredThrowableException», сменив на «RuntimeException» исправленное. 12 апр. 152015-04-12 17:19:54

  0

Полезно знать об этом. К счастью, в моем случае я использую RuntimeExceptions, но это может быть не всегда так. 25 июл. 172017-07-25 15:15:24


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