scala - 验证集合中的元素,为第一个无效元素返回 Failure

标签 scala

<分区>

如果我有一些验证函数:

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

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

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

有没有一种很好的方法可以在发现第一个元素无效时立即返回 Failure

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

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)
}

如果您使用 cats在您的堆栈中,您还可以使用遍历(遍历是 map + sequence):

import cats.implicits._

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

关于scala - 验证集合中的元素,为第一个无效元素返回 Failure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65446837/

相关文章:

scala - scala中使用递归的硬币兑换算法

java - 如何在 Scala 中将一个或多个文件从一个文件夹移动到另一个文件夹

scala - Scala 中的聚合列表值

scala - Scala 2.10 可以提供哪些反射功能?

scala - 如何在 Scala 中进行数据清理

scala - Play Framework 2.1 + ReactiveMongo - 填充多个下拉列表

scala - 在 Scala 中只坚持函数范式的功效

scala - 如何使用 sbt 0.11 部署 Web 应用程序?

json - Play 2 作为仅后端 API

java - 使用Java URI验证案例类中的url