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

Scala中如何根据ID集合从员工集合高效提取非空部门集合

高效获取指定ID员工的部门集合

给定员工类定义:

class Employee(id: String, name: String, dept: Option[String])

需求是从员工集合中,根据一组ID筛选出对应的非空部门集合。原实现存在多次遍历、重复查找的性能问题(员工规模约25000条),原代码如下:

employees.filter( if ( ids.contains( _.id) {_.dept.getOrElse("")} else "" }.filter(_.nonEmpty).toSeq

优化思路与实现

核心优化点

  • 把ID集合转为Set[String]:contains操作复杂度从O(n)降到O(1),彻底解决重复查找的开销
  • 单次遍历完成筛选+提取:避免多次迭代员工集合,减少不必要的计算

方案一:遍历员工集合(适合ID数量接近员工数量的场景)

val idSet = ids.toSet
employees.collect {
  case emp if idSet.contains(emp.id) => emp.dept
}.flatten.toSeq
  • collect一次遍历员工集合,同时完成ID匹配和部门提取
  • flatten自动过滤掉None类型的部门,直接得到非空部门序列

方案二:遍历ID集合(适合ID数量远小于员工数量的场景)

ids.toSet
  .flatMap(id => employees.find(_.id == id).flatMap(_.dept))
  .toSeq
  • 以ID集合为遍历对象,逐个查找对应员工并提取部门
  • 相比遍历全量员工,当ID数量很少时更高效

方案三:预构建映射(适合频繁查询的场景)

如果需要多次执行这类查询,可以预先构建ID到部门的映射,初始化一次后查询零成本:

// 初始化时构建映射(仅需一次)
val idToDeptMap: Map[String, Option[String]] = employees.map(emp => emp.id -> emp.dept).toMap

// 后续查询直接使用映射
ids.flatMap(idToDeptMap.get).flatten.toSeq
  • 初始化阶段遍历一次员工集合,后续每次查询的时间复杂度仅为O(m)(m为ID数量),性能最优

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:21:03