不存在类型变量 U 的实例,因此 void 符合 U

我试图避免在下面的代码中检查 isPresent ,但编译器会发出错误消息

“不存在类型变量 U 的实例,因此 void 符合 U

在调用 printAndThrowException 时。这是我的代码:

values.stream()
    .filter(value -> getDetails(value).getName.equals("TestVal"))
    .findFirst()
    .map(value -> printAndThrowException(value))
    .orElseThrow(new Exception2("xyz"));

有问题的方法 printAndThrowException 具有以下签名:

void printAndThrowException(Pojo value)

上述方法总是抛出 RuntimeException 类型的异常。上述代码不是确切的代码,只是将我的代码转换为代表情况。

这里有什么问题以及在调用 isPresent 时如何避免使用 printAndThrowException

stack overflow No instance(s) of type variable(s) U exist so that void conforms to U
原文答案
author avatar

接受的答案

Optional.map() 期望 Function<? super T, ? extends U> 作为参数。由于您的方法返回 void ,因此在lambda中不能这样使用。

我在这里看到三个选项:

使该方法返回 Void / Object /否则 - 语义上不理想,但它会起作用
使该方法返回异常,然后将lambda定义更改为 ```
.map(v -> {
throw printAndReturnException();
});

``` 

*使用 ifPresent() ,然后在呼叫链外移动 orElseThrow() : ```
values.stream()
.filter(value -> getDetails(value).getName.equals("TestVal"))
.findFirst()
.ifPresent(value -> printAndThrowException(value))
throw new Exception2("xyz");

``` 

答案:

相关问题