Scala 转换
Scala transformations
我是 Scala 的新手,我想问一个简单的问题。
我有一个函数 returns Future[Option[T]
def findOne(query: JsObject)(implicit reader: Reads[T]): Future[Option[T]] = {
Logger.debug(s"Finding one: [collection=$collectionName, query=$query]")
collection.find(query).one[T]
}
而且我必须 return Future[Option[PasswordInfo]]
。
我试过:
def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {
val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))
result.onSuccess{
case something => Future.successful(Some(something).getOrElse(None))
}
}
我的class:
case class PersistentPasswordInfo(
loginInfo: LoginInfo,
authInfo: PasswordInfo
) extends TemporalModel {
override var created: Option[DateTime] = _
override var updated: Option[DateTime] = _
override var _id: Option[BSONObjectID] = _
}
您需要映射 Future 以获取 Option,然后映射 Option 以获取 PersistedPasswordInfo
def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {
val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))
result.map(opt => opt.map(ppi => ppi.authInfo))
}
Future 和 Option 都是 Functor,它们实现了一个方法映射,具有类似于以下签名的东西(假设包含 Future 的类型 arg 是 A):
def map[B](f: A => B): Future[B]
所以上面的代码通过应用函数 Option[PersistentPasswordInfo] => Option[PasswordInfo]
来改变 Future
该函数是通过将映射应用到具有函数 PersistentPasswordInfo => PasswordInfo
的包含选项来创建的
我是 Scala 的新手,我想问一个简单的问题。
我有一个函数 returns Future[Option[T]
def findOne(query: JsObject)(implicit reader: Reads[T]): Future[Option[T]] = {
Logger.debug(s"Finding one: [collection=$collectionName, query=$query]")
collection.find(query).one[T]
}
而且我必须 return Future[Option[PasswordInfo]]
。
我试过:
def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {
val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))
result.onSuccess{
case something => Future.successful(Some(something).getOrElse(None))
}
}
我的class:
case class PersistentPasswordInfo(
loginInfo: LoginInfo,
authInfo: PasswordInfo
) extends TemporalModel {
override var created: Option[DateTime] = _
override var updated: Option[DateTime] = _
override var _id: Option[BSONObjectID] = _
}
您需要映射 Future 以获取 Option,然后映射 Option 以获取 PersistedPasswordInfo
def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {
val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))
result.map(opt => opt.map(ppi => ppi.authInfo))
}
Future 和 Option 都是 Functor,它们实现了一个方法映射,具有类似于以下签名的东西(假设包含 Future 的类型 arg 是 A):
def map[B](f: A => B): Future[B]
所以上面的代码通过应用函数 Option[PersistentPasswordInfo] => Option[PasswordInfo]
来改变 Future该函数是通过将映射应用到具有函数 PersistentPasswordInfo => PasswordInfo
的包含选项来创建的