斯卡拉:在名单上尝试第一次成功

时间:2014-11-06 21:28:35

标签: scala functional-programming try-catch scalaz fold

A => Try[B]上应用函数List[A]并返回第一个成功结果Some[B](它短路)或者如果一切都失败,返回{{}的惯用方法是什么? 1}}

我想做这样的事情:

None

3 个答案:

答案 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