You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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属于合法范围的元素。
  • 可选部分:
    1. 筛选出所有标记为可选的B元素
    2. 对每个可选B元素,找出A序列中所有code与之匹配的元素
    3. 要求这些匹配的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"的元素 → 校验通过

内容的提问来源于stack exchange,提问作者ahabrahante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:42:48