Scalaz验证,验证内在价值
发布时间:2020-12-16 10:02:10 所属栏目:安全 来源:网络整理
导读:我有一个Validation对象 val v = Validation[String,Option[Int]] 我需要进行第二次验证,以检查实际的Integer值是否等于100.如果我做 val vv = v.map(_.map(intValue = if (intValue == 100) intValue.success[String] else "Bad value found".fail[Integer]
我有一个Validation对象
val v = Validation[String,Option[Int]] 我需要进行第二次验证,以检查实际的Integer值是否等于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] } 解决方法
您的解决方案过于复杂.以下就足够了!
v flatMap (_.filter(_ == 100).toSuccess("Bad value found")) toSuccess来自OptionW,并将Option [A]转换为Validation [X,A],在选项为空的情况下获取为失败案例提供的值. flatMap的工作方式如下: Validation[X,A] => (A => Validation[X,B]) => (via flatMap) Validation[X,B] 也就是说,flatMap映射然后展平(加入scalaz-parlance): Validation[X,A] => (A => Validation[X,B]] => (via map) Validation[X,Validation[X,B]] => (via join) Validation[X,B] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |