我在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]]
。是否有干净的方式处理这样的期货?谢谢!
答案 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))