如何迭代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
相关产品推荐
相关产品推荐

