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

259

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

java.util.Optional.orElseThrow()

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

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

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

МДО
источник
43
Почему ты не можешь сделать orElseThrow(() -> new MyException(someArgument))?
Кристофер Хаммарстрем
6
Профессиональный Java-программист с большим количеством потоков и дополнительным опытом… Иногда я все же бываю здесь. И именно поэтому я предпочитаю Kotlin.
Дрю Стивенс

Ответы:

507

Конечно.

.orElseThrow(() -> new MyException(someArgument))
Луи Вассерман
источник
22

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

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

Manu
источник
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