在A => Try[B]
上应用函数List[A]
并返回第一个成功结果Some[B]
(它短路)或者如果一切都失败,返回{{}的惯用方法是什么? 1}}
我想做这样的事情:
None
答案 0 :(得分:9)
您可以在少一步中使用collectFirst
执行相同的操作:
inputs.iterator.map(foo).collectFirst { case Success(x) => x }
答案 1 :(得分:6)
你想要这个:
inputs
.iterator // or view (anything lazy works)
.map(foo)
.find(_.isSuccess)
.map(_.get)
返回Option[B]
。
答案 2 :(得分:0)
这是同样的事情,但如果没有成功,它将返回列表中的最后一个 Failure
。理论上 tries.find(_.isSuccess).getOrElse(tries.last)
会起作用,但在列表视图(懒惰列表)上会导致所有尝试被评估两次。相反,这适用于惰性列表(抛出空集合):
val tries = inputs.view.map(foo)
val firstSuccessOrLastFailure = tries.zipWithIndex.collectFirst({
case (s @ Success(_), _) => s
case (f, i) if (i == tries.size - 1) => f
}).get