我有一个验证对象
val v = Validation[String, Option[Int]]
我需要进行第二次验证,例如检查实际整数值是否等于 100。如果我做
val vv = v.map(_.map(intValue => if (intValue == 100)
intValue.success[String]
else
"Bad value found".fail[Integer]))
我得到:
Validation[String, Option[Validation[String, Int]]]
如何以最简洁的方式将 vv 也作为 Validation[String, Option[Int]]
=========
从我自己找到可能的解决方案:
val validation: Validation[String, Option[Int]] = Some(100).success[String]
val validatedTwice: Validation[String, Option[Int]] = validation.fold(
_ => validation, // if Failure then return it
_.map(validateValue _) getOrElse validation // validate Successful result
)
def validateValue(value: Int): Validation[String, Option[Int]] = {
if (value == 100)
Some(value).success[String]
else
"Bad value".fail[Option[Int]]
}
虽然有效,但看起来并不简洁优雅
===============
我自己的第二个解决方案,但也看起来过于复杂:
val validatedTwice2: Validation[String, Option[Int]] = validation.flatMap(
_.map(validateValue _).map(_.map(Some(_))) getOrElse validation)
def validateValue(value: Int): Validation[String, Int] = {
if (value == 100)
value.success[String]
else
"Bad value".fail[Int]
}