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


259

Я хотів би скористатися

java.util.Optional.orElseThrow()

з типом винятку, який запитує параметр конструктора. Щось на зразок цього:

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

Чи є спосіб створити Постачальника, який передає значення мого аргументу?


43
Чому ти не можеш цього зробити orElseThrow(() -> new MyException(someArgument))?
Крістофер Хаммарстрем

6
Професійний Java-програміст з великою кількістю потоків та необов'язковий досвід ... Я все ще часом буваю тут. І саме тому я віддаю перевагу Котліну.
Дрю Стівенс

Відповіді:



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 Можливо, ви посилаєтесь на JDK-8047338, обговорюваний у цьому запитанні, киньте RuntimeException всередині потоку за допомогою Optional.orElseThrow . Якщо це так, включіть у відповідь. У мене не було достатньо кави, щоб визначити, чи це пляма чи ні, тож я утримаюсь від редагування вашої відповіді сам.
Василь Бурк

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

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