我是从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]]
flatten
。 - Nagarjuna Pamu类型不匹配,期望:Array [Document],实际:mutable.ArrayOps [Document]
。 - KenError:(36, -1) Play 2 Compiler: found : Array[scala.concurrent.Future[models.Document]] required: M[scala.concurrent.Future[A]] on the line val futures = Future.sequence(docs)
。看起来Future.sequence()
期望的是一个“Monad”,而不是“Array”。 - Ken