我确定这是在某个地方回答的,但是我没有足够好的搜索词来找到它。我正在使用io.vavr.control.Try程序包,当我尝试在结果流中的元素上使用getOrElseThrow方法时,该方法与io.vavr.Value类不明确。我可以指定要使用哪种方法,还是不可能?
答案 0 :(得分:2)
您可以将NotFoundException::new
替换为t -> new NotFoundException(t)
,而后者仅与Function参数匹配。
答案 1 :(得分:2)
由于您没有发布完整的代码,所以我只能对NotFoundException
的外观做出有根据的猜测,但是我认为它至少包含以下两种构造函数:
public NotFoundException() {}
public NotFoundException(Throwable cause) {
super(cause);
}
如果您想对Try.getOrElseThrow
使用构造函数方法引用,则需要通过删除这些构造函数之一来消除方法引用的歧义(或可能会降低可见性),或者退一步使用lambda来构造结果抛出。
如果您不能或者不想更改NotFoundException
类,则可以退回到使用lambda而不是方法引用(1和2),或者可以创建显式的{{1}借助vavr函数类型工厂方法,}}(2)或Function
(3)实例:
Consumer
答案 2 :(得分:2)
您有很多选择:
将显式类型转换添加到所需的类型:
.map(rsp -> rsp.getOrElseThrow((Supplier<NotFoundException>) NotFoundException::new))
.map(rsp -> rsp.getOrElseThrow((Function<? super Throwable, NotFoundException>) NotFoundException::new))
使用lambda表达式代替方法引用:
.map(rsp -> rsp.getOrElseThrow(() -> new NotFoundException()))
.map(rsp -> rsp.getOrElseThrow(t -> new NotFoundException(t)))
使用外部lambda参数的显式类型:
.map((Value<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))
.map((Try<…> rsp) -> rsp.getOrElseThrow(NotFoundException::new))