3

我是 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返回一个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]]
4

1 回答 1

3

尝试collectSome返回由 Future 返回的 sgetDocumentByID

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。数组是可变的,它们不会动态增长。因此建议避免在并发/并行代码中使用 Array。

于 2016-11-15T19:45:01.203 回答