Java 8方法引用:提供一个能够提供参数化结果的供应商

304

我想要使用

java.util.Optional.orElseThrow()

使用要求构造函数参数的异常类型。类似于这样:

.orElseThrow(MyException::new(someArgument)) // obviously NOT working
有没有一种方法可以创建一个Supplier,它会将我的参数值传递进去?

48
为什么你不能使用 orElseThrow(() -> new MyException(someArgument)) 呢? - Christoffer Hammarström
10
有丰富的Java编程经验,尤其擅长使用流(streams)和Optional,但有时仍会遇到问题。这就是为什么我更喜欢Kotlin的原因。 - Drew Stephens
3个回答

605
当然。
.orElseThrow(() -> new MyException(someArgument))

26

看起来你只能从方法 orElseThrow 中抛出 RuntimeException。否则,你将会收到类似于 MyException cannot be converted to java.lang.RuntimeException 的错误消息。

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


1
谢谢,当我在Groovy中使用Optional时,这让我感到困惑。我试图从Groovy闭包中throw Exception,但它失败了,并显示了java.lang.reflect.UndeclaredThrowableException,将其更改为RuntimeException后问题得到解决。 - Ted Naleid
很高兴知道这个。幸运的是,在我的情况下,我正在使用RuntimeExceptions,但并非总是如此。 - hbobenicio
根据Optional.orElseThrow类文档,这是不正确的。文档中指出,您可以抛出一个Throwable,这意味着可以抛出Error或任何Exception - Basil Bourque
我认为这是JDK 8旧版本的问题。 - Manu
@Manu 也许你指的是在这个问题中讨论的 JDK-8047338Throw RuntimeException inside Stream with Optional.orElseThrow。如果是的话,请在你的回答中包含它。我还没有喝足够的咖啡来确定这是否完全正确,所以我会避免自己编辑你的回答。 - Basil Bourque

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

我遇到了错误:“类型 Optional<QueryEntities> 中的方法 orElseThrow(Supplier<? extends X>) 不适用于参数(() -> {})”。 - BdEngineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接