我收到了一篇关于如何在列表缓冲区恰好在循环中调用的scala future中构建的情况下获得字符串列表缓冲区的文章。
这是一个亲吻的例子
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是空列表,有时是我期望的内容。显然,在评估未来之前,这种方法是完整的。
只是为了添加
- 我不想使用future.await
- 将myCollections作为Future obj传递是不起作用的,因为在评估myCollections之前,没有myFuture必须完成的绑定
请帮帮我。
感谢
这将返回一个future
。如果您不关心等待它完成,您可以始终使用.value
:访问底层值
def INeedThatListBuffer(): Future[ListBuffer[String]] = {
def buildFutureFromDay(day: String): Future[String] = Future { ??? }
Future
.sequence(daysInAWeek.map(buildFutureFromDay))
.map(_.foldLeft(ListBuffer[String]())(_ += _))
}
您需要在某个时刻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
,因为它已经是可变的。