Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 有没有更惯用的方法使用Casbah检查密码?_Scala_Mongodb_Casbah - Fatal编程技术网

Scala 有没有更惯用的方法使用Casbah检查密码?

Scala 有没有更惯用的方法使用Casbah检查密码?,scala,mongodb,casbah,Scala,Mongodb,Casbah,我有以下代码: def authenticateByUsername(username: String, password:String): Boolean = { val user = users.findOne(MongoDBObject(USERNAME -> username)) if(user.isDefined){ val pw = user.get.getAs(PASSWORD) if(pw.isDefined)

我有以下代码:

def authenticateByUsername(username: String, password:String): Boolean = { val user = users.findOne(MongoDBObject(USERNAME -> username)) if(user.isDefined){ val pw = user.get.getAs(PASSWORD) if(pw.isDefined) BCrypt.checkpw(pw.get, password) else false }else false } def authenticateByUsername(用户名:字符串,密码:字符串):布尔={ val user=users.findOne(MongoDBObject(用户名->用户名)) 如果(用户已定义){ val pw=user.get.getAs(密码) 如果(pw.已定义) BCrypt.checkpw(pw.get,密码) 否则错误 }否则错误 }
有没有更惯用的方法?这是一个if-else的噩梦,在Scala中似乎并不正确。

你是正确的,有一个更好的方法,通常在
选项上使用
get
(或者,在稍微小一点的程度上,
是定义的
)是一个危险信号。在这种情况下,您可以使用
进行理解:

def authenticateByUsername(username: String, password: String): Boolean = {
  val result: Option[Boolean] = for {
    user <- users.findOne(MongoDBObject(USERNAME -> username))
    pass <- user.getAs(PASSWORD)
  } yield BCrypt.checkpw(pass, password)

  result getOrElse false
}

后者本质上只是用于理解的
的一个去糖化版本。

更好,我有类似的东西,但我没有考虑将
结果
包装在一个选项中,然后对结果使用
getOrElse
。我觉得第一本书更具可读性。大声朗读时,听起来更感性。
def authenticateByUsername(username: String, password: String): Boolean =
  users.findOne(MongoDBObject(USERNAME -> username)).flatMap(
    _.getAs(PASSWORD)
  ).map(
    BCrypt.checkpw(_, password)
  ).getOrElse(false)