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


259

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

java.util.Optional.orElseThrow()

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

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

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


43
Почему ты не можешь сделать orElseThrow(() -> new MyException(someArgument))?
Кристофер Хаммарстрем

6
Профессиональный Java-программист с большим количеством потоков и дополнительным опытом… Иногда я все же бываю здесь. И именно поэтому я предпочитаю Kotlin.
Дрю Стивенс

Ответы:



22

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

Обновление : - Это была проблема со старой версией JDK. Я не вижу этой проблемы с последними версиями.


1
спасибо, это меня отталкивало при использовании Optionalв groovy. Пыталась throw Exceptionот заводного замыкания, но потерпела неудачу java.lang.reflect.UndeclaredThrowableException, изменив его на RuntimeExceptionфиксированное.
Тед Нейлид

Приятно знать об этом. К счастью, в моем случае я использую RuntimeExceptions, но это не всегда так.
hbobenicio

Неправильно в соответствии с документацией класса, для Optional.orElseThrowкоторой написано, что вы можете бросить, Throwableчто означает Errorили любой Exception.
Базилик Бурк

Я думаю, что это была проблема со старой версией JDK 8.
Manu

@Manu Возможно, вы имеете в виду JDK-8047338, обсуждаемый по этому вопросу, - выбросить RuntimeException в Stream с помощью Optional.orElseThrow . Если это так, включите в свой ответ. У меня не было достаточно кофе, чтобы различить, если он точечный или нет, поэтому я сам воздержусь от редактирования вашего Ответа.
Василий Бурк

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

я получаю сообщение об ошибке "Метод orElseThrow (Supplier <? extends X>) в типе Optional <QueryEntities> не применим для аргументов (() -> {})"
BdEngineer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.