我有一些数据需要进行系列验证。我有以下可行的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
}
}