让scala将来等待修改变量

时间:2017-08-29 01:09:28

标签: scala scala-collections concurrent.futures

如果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是空列表,有时候是我期望的内容。显然,这种方法在评估未来之前已经完成。

添加

  1. 我不想使用future.await
  2. 将myCollections作为Future obj传递不起作用,因为在评估myCollections之前没有绑定myFuture必须完成。
  3. 请帮助我。

    由于

2 个答案:

答案 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,因为它已经是可变的。