我有一个Try<Option<Foo>>
. 我想flatMap
Foo
进入一个Bar
,使用它使用可能失败的操作。如果 myOption<Foo>
是Option.none()
, (并且Try
成功),这不是失败,在这种情况下,没有什么可做的。
所以我有这样的代码,它确实有效:
Try<Option<Bar>> myFlatMappingFunc(Option<Foo> fooOpt) {
return fooOpt.map(foo -> mappingFunc(foo).map(Option::of) /* ew */)
.getOrElse(Try.success(Option.none()); // double ew
}
Try<Bar> mappingFunc(Foo foo) throws IOException {
// do some mapping schtuff
// Note that I can never return null, and a failure here is a legitimate problem.
// FWIW it's Jackson's readValue(String, Class<?>)
}
然后我称之为:
fooOptionTry.flatMap(this::myFlatMappingFunc);
这确实有效,但它看起来真的很难看。
有没有更好的方法来翻转Try
和Option
周围?
注意 1:我主动不想在其中调用Option.get()
和捕获它,Try
因为它在语义上不正确。我想我可以恢复,NoSuchElementException
但这似乎更糟糕,代码方面。
注2(解释标题):天真地,显而易见的事情是:
Option<Try<Bar>> myFlatMappingFunc(Option<Foo> fooOpt) {
return fooOpt.map(foo -> mappingFunc(foo));
}
除了这有错误的签名并且不让我映射上一个可能失败的操作并且还成功返回了缺少值的操作。