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

如何迭代Scala Enumeration中包含特定角色值的枚举成员?

问题1:为什么输出TreeSet(())

  • println函数的返回值是Unit类型,对应值就是()
  • 调用UserType.values.map(println)时,map会把每个枚举值传入println执行打印,同时把所有println的返回值()收集成新的集合
  • 因为values本身是TreeSet结构,Set会自动去重,两个()会被合并为1个,最终你把这个收集了()的Set打印,就输出了TreeSet(())

注意:如果只是要遍历打印枚举值,不要用map,改用专门用于执行副作用的foreach方法:UserType.values.foreach(println),就不会产生额外的空Set输出。

问题2:筛选包含指定role的枚举值实现方法

你写的UserType.values.filter(_.roles.contains("member"))目前不能直接运行,因为UserType.values默认返回的元素类型是Enumeration.Value,没有公开的roles属性,可选择以下两种方案实现:

方案1:最简修改,显式类型转换

直接在filter时把元素强转成你定义的UTValue类型即可:

val memberTypes = UserType.values.filter(_.asInstanceOf[UserType.UTValue].roles.contains("member"))
// 遍历测试
memberTypes.foreach(println)
// 输出:superUser

方案2:优化枚举定义,避免每次强转

调整Enumeration的实现,让values直接返回你自定义的UTValue类型集合:

object UserType extends Enumeration {
  type UserType = UTValue

  protected case class UTValue(name: String, roles: Set[String]) extends super.Val {
  }

  val anonymous: UserType = UTValue("anonymous", Set.empty)
  val superUser: UserType = UTValue("super", Set("member", "admin", "edit", "delete"))

  // 重写values方法返回正确类型的集合
  def values: ValueSet[UserType] = super.values.asInstanceOf[ValueSet[UserType]]
}

// 现在可以直接调用roles属性,不需要强转
val memberTypes = UserType.values.filter(_.roles.contains("member"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:57:03