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

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

java.util.Optional.orElseThrow()

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

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

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


person mdo    schedule 07.04.2014    source источник
comment
Почему ты не можешь сделать orElseThrow(() -> new MyException(someArgument))?   -  person Christoffer Hammarström    schedule 07.04.2014
comment
Профессиональный программист на Java с большим количеством потоков и дополнительным опытом ... Иногда я все еще здесь. Вот почему я предпочитаю Котлин.   -  person Drew Stephens    schedule 22.06.2018


Ответы (3)


Конечно.

.orElseThrow(() -> new MyException(someArgument))
person Louis Wasserman    schedule 07.04.2014

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

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

person Manu    schedule 11.02.2015
comment
спасибо, это сбивало меня с толку при использовании Optional в Groovy. Пытался throw Exception из отличного закрытия, но не удалось java.lang.reflect.UndeclaredThrowableException, изменение на RuntimeException исправило. - person Ted Naleid; 12.04.2015
comment
Приятно знать об этом. К счастью, в моем случае я использую RuntimeExceptions, но это может быть не всегда. - person hbobenicio; 25.07.2017
comment
Неправильно согласно документации класса для _ 1_, в котором говорится, что вы можете создать _ 2_, что означает Error или любое Exception. - person Basil Bourque; 24.08.2018
comment
Я думаю, что это проблема более старой версии JDK 8. - person Manu; 20.12.2018
comment
@Manu Возможно, вы имеете в виду JDK-8047338, обсуждаемый в этом Вопросе, < a href = "https://stackoverflow.com/q/39076077/642706"> Вызвать исключение RuntimeException внутри потока с помощью Optional.orElseThrow. Если да, включите в свой ответ. Я не выпил достаточно кофе, чтобы понять, правильно это или нет, поэтому я воздержусь от редактирования вашего ответа сам. - person Basil Bourque; 25.05.2019

person    schedule
comment
я получаю сообщение об ошибке Метод orElseThrow (Supplier ‹? extends X›) в типе Optional ‹QueryEntities› не применим для аргументов (() - ›{}) - person BdEngineer; 11.06.2019