验证集合中的元素,返回第一个无效元素的失败

如果我有一些验证功能:

def validateOne(a: A): Try[A]

我现在想通过使用该validateOne函数来验证 A 的集合

def validateAll(all: List[A]): Try[List[A]]

Failure一旦发现第一个元素无效,是否有一种很好的方法来返回 a ?

我现在这样做的方法是get在验证每个元素后调用。对于validateOne返回的第一个元素Failureget抛出包装异常......我捕捉到重新包装:

def validateAll(all: List[A]): Try[List[A]] = try {
  all.map(a => validateOne(a).get)
} catch {
  case e: MyValidationException => Failure(e)
}

回答

您可以使用Future.sequence轻松转换List[Future[A]]为。不幸的是,标准库没有为.Future[List[A]]Try

但是您可以创建自己的尾递归、失败的快速函数来迭代结果:

def validateAll[A](all: List[A]): Try[List[A]] = {

  //additional param acc(accumulator) is to allow function to be tail-recursive
  @tailrec
  def go(all: List[A], acc: List[A]): Try[List[A]] =
    all match {
      case x :: xs =>
        validateOne(x) match {
          case Success(a) => go(xs, a :: acc)
          case Failure(t) => Failure(t)
        }
      case Nil => Success(acc)
    }

  go(all, Nil)
}

如果您在堆栈中使用猫,您还可以使用遍历(遍历是映射 + 序列):

import cats.implicits._

def validateAll2[A](all: List[A]): Try[List[A]] = all.traverse(validateOne)


以上是验证集合中的元素,返回第一个无效元素的失败的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>