我正在努力避免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
?
Optional.map()
期望一个Function<? super T, ? extends U>
作为参数。由于你的方法返回void
,它不能在 lambda 中这样使用。
我在这里看到三个选项:
- 使该方法返回
Void
/Object
/无论什么——语义上并不理想,但它会起作用
- 使该方法返回异常,并将 lambda 定义更改为
.map(v -> {
throw printAndReturnException();
});
- use
ifPresent()
,并移动orElseThrow()
在调用链之外:values.stream()
.filter(value -> getDetails(value).getName.equals("TestVal"))
.findFirst()
.ifPresent(value -> printAndThrowException(value))
throw new Exception2("xyz");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)