2015-11-12 20 views
1

我在Scala中真的很新,我想问一个简单的问题。Scala转换

我有一个返回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] 
} 

一个功能,我不得不返回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)) 
    } 
} 

我的类:

case class PersistentPasswordInfo(
     loginInfo: LoginInfo, 
     authInfo: PasswordInfo 
     ) extends TemporalModel { 
    override var created: Option[DateTime] = _ 
    override var updated: Option[DateTime] = _ 
    override var _id: Option[BSONObjectID] = _ 
} 
+0

'Future.successful(Some(something).getOrElse(None))'是错误的。 'Future.successful(Some(something))'应该就足够了,只要某些东西是一个密码信息 –

+0

东西是PersistentPasswordInfo,我需要'authInfo'在我的类里面 – glarkou

+0

'Future.successful(Some(something.authInfo))' ? –

回答

1

你需要映射在未来获得的选项,然后映射在选项获取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都是Functors,他们实现了一个类似下面的方法映射签名(假设类型ARG与含未来是A):

def map[B](f: A => B): Future[B] 

所以上面的代码通过应用函数选项[PersistentPasswordInfo] =>选项[PasswordInfo]

该功能是通过创建改变未来将函数映射到函数PersistentPasswordInfo => PasswordInfo

+0

你可以使用_来缩短这个,但我想显示functor被映射的是什么在每一步。 较短的版本将是result.map(_。map(_。authInfo)) –

+0

谢谢。但是你能解释一下吗?如果'findOne'返回空值会发生什么? “ppi.authInfo”将如何执行?为什么它不会返回空指针异常? (试图访问一个空对象的字段) – glarkou

+0

我得到'[error]对象的方法defaultContext在类型=> scala.concurrent.ExecutionContext中的含义 [error]和方法ec在类型=> scala.concurrent的特性ContextHelper中.ExecutionContext [error] match expected type scala.concurrent.ExecutionContext [error] result.map(opt => opt.map(ppi => ppi.authInfo)' – glarkou