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
相关产品推荐
相关产品推荐

