代码之家  ›  专栏  ›  技术社区  ›  Ken

从Scala中的未来选项获取未来对象

  •  3
  • Ken  · 技术社区  · 8 年前

    我是从Java开始接触Scala的,所以函数式编程对我来说还是有点难理解。我有一个项目在玩框架。我需要查询数据库以获取具有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] 因此,我试图改变 未来〔期权〔文件〕 数组[文档]

    我当前的代码是最接近的,但仍然无法编译。这是错误:

    Error:(36, -1) Play 2 Compiler: 
        found   : Array[scala.concurrent.Future[Option[models.Document]]]
        required: M[scala.concurrent.Future[A]]
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Nagarjuna Pamu    8 年前

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