我是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]]
转换为{{1}无效}}
我当前的代码是我最接近的代码,但它仍然无法编译。这是错误:
Array[Document]
答案 0 :(得分:3)
尝试collect
仅Some
getDocumentByID
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
。数组是可变的,它们不会动态增长。
因此,建议避免在并发/并行代码中使用Array。