【发布时间】:2018-09-10 00:30:42
【问题描述】:
我有一个Try<Option<Foo>>。我想将flatMapFoo 转换为Bar,使用可能失败的操作。如果我的Option<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));
}
除了这个有错误的签名并且不允许我与之前可能失败的操作进行映射,并且还成功返回了缺少值。
【问题讨论】:
-
我害怕问一个比我多 2 万代表的人,但是:如果你有工作代码,难道 Code Review 不是一个更好的网站来问这个问题吗?
-
@AJNeufeld 如果代码审查包含真实代码,这可能是一个很好的问题。声明“这样的代码......”的问题看起来像示例代码,这将是题外话。 OP 应该清楚地表明代码是从生产就绪的角度来看的。此外,在 CR 上,您要求审查,不一定是替代方案。评论可以显示替代方案(如果存在)。另见codereview.meta.stackexchange.com/questions/5777/…
-
-
@durron597 我知道我在伸脖子,在评论之前应该三思而后行。 (JSYK:你有 25k,而不是 20k。我说还有 20k……)
-
@AJNeufeld 永远不会在懒惰的时候假设自己无能