未来完成后Scala返回变量类型添加注释折叠

时间:2017-07-06 10:10:38

标签: scala playframework

我在scala处理期货后返回列表时出现问题。我的代码如下所示:

def getElements(arrayOfIds: Future[Seq[Int]]): Future[Seq[Element]] = {
    var elementArray: Seq[Element] = Seq()

    arrayOfIds.map {
      ids => ids.map(id => dto.getElementById(id).map {
                    case Some(element) => elementArray = elementArray :+ element
                    case None => println("Element not found")
                  })
    }
    arrayOfIds.onComplete(_ => elementArray)
  }

我想做.onComplete之类的事情,但返回类型是  Unit并且我想要返回Future[Seq[Whatever]]。是否有干净的方式处理这样的期货?谢谢!

2 个答案:

答案 0 :(得分:2)

不是将结果赋给可变变量,而是从Future的延续处返回。您可以使用flatMap仅提取实际包含值的Element结果:

def getElements(arrayOfIds: Future[Seq[Int]]): Future[Seq[Element]] = {
  arrayOfIds.flatMap(id => Future.fold(id.map(getElementById))(Seq.empty[Element])(_ ++ _))
}

答案 1 :(得分:2)

请提供函数类型dto.getElementById。如果是Int => Future[Option[Element]],那么:

def getElements(arrayOfIds: Future[Seq[Int]]): Future[Seq[Element]] = {
  val allElements: Future[Seq[Option[Element]]] = arrayOfIds.flatMap( ids =>
    Future.sequence(ids.map(dto.getElementById))
  )
  allElements.map(_.flatMap{
    case None => println();None
    case some => some
  })
}

没有记录,它将是:

arrayOfIds.flatMap( ids => Future.traverse(ids.map(dto.getElementById))(_.flatten))