我有以下代码:
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 }
有没有更惯用的方法呢?这是一个if-else的噩梦,在Scala中似乎不对。
答案 0 :(得分:2)
你说这是更好的方法,通常在get
使用isDefined
(或稍微程度较小,Option
)是一个红旗。在这种情况下,您可以使用for
- 理解:
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
}
或者,更简洁一点:
def authenticateByUsername(username: String, password: String): Boolean =
users.findOne(MongoDBObject(USERNAME -> username)).flatMap(
_.getAs(PASSWORD)
).map(
BCrypt.checkpw(_, password)
).getOrElse(false)
后者本质上只是for
- 理解的一个荒谬版本。