Java 8方法参考:提供能够提供参数化结果的供应商


259

我想用

java.util.Optional.orElseThrow()

具有要求构造函数参数的Exception类型。像这样:

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

有没有办法创建一个将我的参数值传入的供应商?


43
你为什么不能orElseThrow(() -> new MyException(someArgument))呢?
ChristofferHammarström2014年

6
具有大量信息流和可选经验的专业Java程序员……有时我还是会在这里结束。这就是为什么我更喜欢Kotlin。
德鲁·斯蒂芬斯

Answers:



22

看来您只能从该方法抛出RuntimeException orElseThrow。否则,您会收到一条错误消息,例如 MyException cannot be converted to java.lang.RuntimeException

更新:-这是旧版JDK的问题。我没有在最新版本中看到此问题。


1
谢谢,这使我在使用OptionalGroovy 时无法使用。尝试throw Exception从常规的闭包开始,但由于失败java.lang.reflect.UndeclaredThrowableException,更改为RuntimeException固定的。
泰德·纳莱德

很高兴知道这一点。幸运的是,我使用的是RuntimeExceptions,但并非总是如此。
hbobenicio

根据类文档的不正确说明,Optional.orElseThrow您可以为此抛出“ Throwablean” Error或“ an” Exception
罗勒·布尔克

我认为这是旧版JDK 8的问题
。– Manu

@Manu也许您是指在此问题上讨论过的JDK-8047338,即使用Optional.orElseThrow在Stream中抛出RuntimeException。如果是这样,请在您的答案中包括。我还没有足够的咖啡来辨别这是否是现场的,所以我将避免自己编辑您的答案。
罗勒·布尔克

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

我收到错误“类型为Optional <QueryEntities>的方法orElseThrow(Supplier <?扩展X>)不适用于参数(()-> {})”
BdEngineer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.