Scala中如何校验可选关联元素的类型合法性?
解决方案:完整的Seq[A]与Seq[B]校验逻辑
首先明确类定义:
case class A(tipo: String, label: String, code: String) case class B(key: String, valid_types: Seq[String], isOptional: Boolean)
以下是整合了非可选与可选元素校验的完整实现:
def validation(listA: Seq[A], listB: Seq[B]): Boolean = { // 非可选元素校验:必须存在匹配的合法A元素 val nonOptionalValid = listB.filter(!_.isOptional).forall { config => listA.exists(a => a.code == config.key && config.valid_types.contains(a.tipo)) } // 可选元素校验:存在匹配code的A元素时,其tipo必须合法;无匹配则直接合法 val optionalValid = listB.filter(_.isOptional).forall { config => listA.filter(_.code == config.key).forall(a => config.valid_types.contains(a.tipo)) } nonOptionalValid && optionalValid }
逻辑说明
- 非可选部分:沿用你之前的实现,确保所有非可选B元素都能在A序列中找到code匹配且tipo属于合法范围的元素。
- 可选部分:
- 筛选出所有标记为可选的B元素
- 对每个可选B元素,找出A序列中所有code与之匹配的元素
- 要求这些匹配的A元素的tipo必须在对应B的
valid_types中;如果没有匹配的A元素,forall会默认返回true(空序列的全称判断恒成立),完全符合需求。
举个场景示例:
- 可选B元素:
B("addr", Seq("home", "work"), isOptional = true)- A序列存在
A("home", "家庭地址", "addr")→ 校验通过 - A序列存在
A("other", "其他地址", "addr")→ 校验失败("other"不在合法类型列表) - A序列无code为"addr"的元素 → 校验通过
- A序列存在
内容的提问来源于stack exchange,提问作者ahabrahante
相关产品推荐
相关产品推荐

