从Scala中的Future Options获取Future对象

时间:2016-11-15 19:40:07

标签: scala functional-programming future playframework-2.3 scala-option

我是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]

1 个答案:

答案 0 :(得分:3)

尝试collectSome

返回的来自未来的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。