您是对的,有更好的方法,并且通常在 an 上使用get
(或者,程度稍低,isDefined
)Option
是一个危险信号。在这种情况下,您可以使用for
-comprehension:
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)
后者本质上只是 -comprehension 的脱糖版本for
。