在Scala中浏览一系列验证的功能方法



我有一些数据需要进行系列验证。我有以下可行的Java样式代码,但看起来很丑。只是想知道处理此类情况的功能/Scala方法是什么?谢谢!

def validateData(data: String): Boolean = {
  try {
    if(!validate1(data)) {
      Logger.error("error1")
      return false
    }
    if(!validate2(data)) {
      Logger.error("error2")
      return false
    }
    if(!validate3(data)) {
      Logger.error("error3")
      return false
    }
  } catch {
    case e: Exception => {
      Logger.error(e.getMessage)
      return false
    }
  }
  true
}

我们可以使用 cats.data.ValidatedNel(在Validated[NonEmptyList[E], A]的别名中),这完全适合这种验证:

import cats.data.ValidatedNel
import cats.implicits._
def validation(data: String): Validated[NonEmptyList[String], Boolean] = {
  def validateData1(data: String): ValidatedNel[String, Unit] = ???
  def validateData2(data: String): ValidatedNel[String, Unit] = ???
  def validateData3(data: String): ValidatedNel[String, Unit] = ???
  val data: String = ???
  val res: ValidatedNel[String, Unit] =
    validateData1(data) *>
      validateData2(data) *>
      validateData3(data)
  res.map(_ => true)
}

,然后:

validation("foo").toEither match {
  case Left(errors) => // log errors
  case Right(validation) => // Do whatever you want with the validated boolean
}

我将使用Try如下:

import scala.util.{Try, Success, Failure}
def validateData(data: String): Boolean = {
  def logErr(valid: Boolean, e: String): Boolean =
    if (valid) true else {
        Logger.error(e)
        false
      }
  Try(logErr(validate1(data), "error1") && 
      logErr(validate2(data), "error2") && 
      logErr(validate3(data), "error3")
    ) match {
      case Success(res) => res
      case Failure(ex)  =>
        Logger.error(ex)
        false
    }
}

最新更新