如何在Scala中不使用模式匹配实现用户登录验证?
当然有更简洁的实现方式,不用写一堆模式匹配的case。核心思路是把合法的用户名-密码(多密码)关系用映射集合存储,然后通过集合查询来验证登录,维护起来比硬编码case方便太多。
方案1:用Map[String, Set[String]]统一存储合法凭证
推荐把凭证放到单独的对象里统一维护,比如User类的伴生对象,这样后续修改用户密码不用动登录逻辑:
object UserCredentials { // 存储合法用户名与对应密码集合 private val validUsers = Map( "Amit" -> Set("AmitSecret1", "AmitSecret2"), "Rahul" -> Set("Atemporary"), "Tom" -> Set("Howareyou"), "Roger" -> Set("Dummy") // 新增/删除用户直接在这里修改即可 ) def isValid(user: User): Boolean = { // 判断用户名存在且密码在对应集合中 validUsers.get(user.username).exists(_.contains(user.password)) } } // 登录方法简化为: def login(user: User): Boolean = UserCredentials.isValid(user)
方案2:内嵌凭证的简化实现
如果不需要单独抽离维护对象,也可以直接在login方法里写:
def login(user: User): Boolean = { val validCredentials = Map( "Amit" -> Set("AmitSecret1", "AmitSecret2"), "Rahul" -> Set("Atemporary"), "Tom" -> Set("Howareyou"), "Roger" -> Set("Dummy") ) validCredentials.get(user.username).exists(_.contains(user.password)) }
补充说明
修正原代码的Scala语法问题:
- 参数定义应为
def login(user: User),而非Java风格的def login(User user) - 模式匹配里的
case("_","_")要写成case (_, _)(下划线无需加引号) - Scala支持类型自动推断,没必要单独给
username/password变量显式声明类型
- 参数定义应为
集合方式的优势:
- 维护成本低:新增用户或修改密码只需要修改映射集合,不用改动登录逻辑
- 代码更简洁:避免大量重复的case语句,可读性更强
- 扩展性好:后续如果要从数据库、配置文件加载凭证,只需要修改凭证集合的初始化逻辑,登录验证核心代码不用变
内容的提问来源于stack exchange,提问作者Thinker
相关产品推荐
相关产品推荐

