gpt4 book ai didi

Java8 Lambda 和异常

转载 作者:IT老高 更新时间:2023-10-28 13:52:12 25 4
gpt4 key购买 nike

我想知道是否有人可以向我解释以下奇怪之处。我正在使用 Java 8 更新 11。

给定这个方法

private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
return fun.apply(opt) ;
}

如果我首先构造一个函数对象,并将其传递给上面的方法,事情就会编译。

private void doesCompile() {
Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
runFun(fun, Optional.of("foo"));

}

但是,如果我将函数内联为 lambda,编译器会说

unreported exception X; must be caught or declared to be thrown

private void doesNotCompile () {
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}

更新:原来错误消息是由 maven 缩写的。如果直接用javac编译,报错:

error: unreported exception X; must be caught or declared to be thrown
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
^
where X,T are type-variables:
X extends Throwable declared in method <X>orElseThrow(Supplier<? extends X>)
T extends Object declared in class Optional

另见 here用于可运行的测试代码。

最佳答案

这就是为我解决问题的方法:

而不是写

optional.map(this::mappingFunction).orElseThrow(() -> new BadRequestException("bla bla"));

我写道:

optional.map(this::mappingFunction).<BadRequestException>orElseThrow(() -> new BadRequestException("bla bla"));

添加显式 <BadRequestException>有助于解决这些 lambda 边缘情况(这很烦人……)

更新:这是为了防止您无法更新到最新的 JDK 版本,如果可以的话,您应该...

关于Java8 Lambda 和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25523375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com