Scala中遍历Seq[A]与Seq[B]序列,验证指定匹配规则是否成立
实现方案
首先注意type是Scala关键字,定义case class时需要用反引号包裹:
case class A(`type`: String, label: String, code: String) case class B(key: String, regex: String)
1. 预编译正则提升性能
先把Seq[B]转成Map[String, scala.util.matching.Regex],预编译正则避免重复编译开销:
val rules: Seq[B] = // 你的规则序列 val ruleMap: Map[String, scala.util.matching.Regex] = rules.map(b => b.key -> b.regex.r).toMap
2. 单个元素验证逻辑
编写函数判断单个A元素是否符合规则:
def validateA(a: A, ruleMap: Map[String, scala.util.matching.Regex]): Boolean = { ruleMap.get(a.`type`) match { case Some(regex) => regex.matches(a.code) case None => true // 无对应规则的元素默认合法,需视为非法可改为false } }
3. 批量验证场景
- 检查所有元素是否都合规:
val seqA: Seq[A] = // 你的A元素序列 val allValid: Boolean = seqA.forall(validateA(_, ruleMap))
- 筛选出所有不符合规则的元素:
val invalidElements: Seq[A] = seqA.filterNot(validateA(_, ruleMap))
4. 带错误信息的验证(可选)
如果需要明确错误详情:
def validateAWithError(a: A, ruleMap: Map[String, scala.util.matching.Regex]): Option[String] = { ruleMap.get(a.`type`) match { case Some(regex) if !regex.matches(a.code) => Some(s"元素[A(type=${a.`type`}, label=${a.label}, code=${a.code})]的code不符合规则${regex.pattern}") case _ => None } } val errors: Seq[String] = seqA.flatMap(validateAWithError(_, ruleMap))
内容的提问来源于stack exchange,提问作者ahabrahante
相关产品推荐
相关产品推荐

