从 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

一般建议

不要使用 Arrays。数组是可变的,它们不会动态增长。 因此,建议避免在 concurrent/parallel 代码中使用数组。