从 Scala 中的 Future Options 获取 Future 对象
Get Future objects from Future Options in Scala
我是从 Java 开始接触 Scala 的新手,所以函数式编程的东西对我来说仍然有点难以理解。我在 Play 框架中有一个项目。我需要查询数据库以获取带有 id 的行并将它们显示在 html 模板中。
这是我的代码
def search(query: String) = Action.async{ request =>
val result = SearchEngine.searchResult(query)
val docs = result.map(DocumentService.getDocumentByID(_).map(doc => doc))
val futures = Future.sequence(docs)
futures.map{documents =>
Ok(views.html.results(documents.flatten))
}
}
getDocumentByID
returns 一个 Future[Options[Document]]
对象,但是我的 results
模板需要 Array[Document]
所以我试图转换 Future[Options[Document]]
至 Array[Document]
我目前的代码是最接近的,但它仍然无法编译。这是错误:
Error:(36, -1) Play 2 Compiler:
found : Array[scala.concurrent.Future[Option[models.Document]]]
required: M[scala.concurrent.Future[A]]
尝试仅 collect
来自 getDocumentByID
返回的 Future 的 Some
val docs = result.map { res =>
val f: Future[Option[Document]] = DocumentService.getDocumentByID(res)
f.collect { case Some(doc) => doc }
}.toList
val futures = Future.seqence(docs) //notice that docs is converted to list from array in the previous line
一般建议
不要使用 Array
s。数组是可变的,它们不会动态增长。
因此,建议避免在 concurrent/parallel 代码中使用数组。
我是从 Java 开始接触 Scala 的新手,所以函数式编程的东西对我来说仍然有点难以理解。我在 Play 框架中有一个项目。我需要查询数据库以获取带有 id 的行并将它们显示在 html 模板中。
这是我的代码
def search(query: String) = Action.async{ request =>
val result = SearchEngine.searchResult(query)
val docs = result.map(DocumentService.getDocumentByID(_).map(doc => doc))
val futures = Future.sequence(docs)
futures.map{documents =>
Ok(views.html.results(documents.flatten))
}
}
getDocumentByID
returns 一个 Future[Options[Document]]
对象,但是我的 results
模板需要 Array[Document]
所以我试图转换 Future[Options[Document]]
至 Array[Document]
我目前的代码是最接近的,但它仍然无法编译。这是错误:
Error:(36, -1) Play 2 Compiler:
found : Array[scala.concurrent.Future[Option[models.Document]]]
required: M[scala.concurrent.Future[A]]
尝试仅 collect
来自 getDocumentByID
Some
val docs = result.map { res =>
val f: Future[Option[Document]] = DocumentService.getDocumentByID(res)
f.collect { case Some(doc) => doc }
}.toList
val futures = Future.seqence(docs) //notice that docs is converted to list from array in the previous line
一般建议
不要使用 Array
s。数组是可变的,它们不会动态增长。
因此,建议避免在 concurrent/parallel 代码中使用数组。