如果listbuffer碰巧是在一个循环中调用的scala future中构造的,那么我已经对如何获取字符串的listbuffer感到震惊。
这是一个吻示例
def INeedThatListBuffer(): ListBuffer[String] = {
var myCollections: ListBuffer[String] = new ListBuffer[String]()
for (day <- daysInaWeek) {
val myFuture: Future[String] = Future {
// use 'day' do some stuff and get me a result
???
}
myFuture.onComplete {
case Success(result) =>
myCollections += result
}
}
myCollections
}
我的问题是,有时listBuffer是空列表,有时候是我期望的内容。显然,这种方法在评估未来之前已经完成。
添加
请帮助我。
由于
答案 0 :(得分:3)
这会返回future
。如果您不关心等待它完成,您始终可以使用.value
访问基础值:
def INeedThatListBuffer(): Future[ListBuffer[String]] = {
def buildFutureFromDay(day: String): Future[String] = Future { ??? }
Future
.sequence(daysInAWeek.map(buildFutureFromDay))
.map(_.foldLeft(ListBuffer[String]())(_ += _))
}
答案 1 :(得分:1)
您需要await
。每个期货的await
可以得到解决,也可以稍后将整个缓冲区的ListBuffer[String]
更改为ListBuffer[Future[String]]
和await
。
val myFutureCollection: ListBuffer[Future[String]] = new ListBuffer[Future[String]]()
val myFuture: Future[String] = Future(???)
myFutureCollection += myFuture
val eventualBuffer: Future[ListBuffer[String]] = Future.sequence(myFutureCollection)
val buffer: ListBuffer[String] = Await.result(eventualBuffer, 2 seconds)
P.S:对于列表缓冲区,您可以val
而不是var
,因为它已经是可变的。