2017-08-29 59 views
-1

我已经对如何在listbuffer恰好在循环调用的scala future中构造的情况下如何获得字符串列表缓冲区的内容感到震惊。让scala未来等待修改一个变量

这里是一个吻例子

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未来OBJ不能正常工作,因为没有约束力的评估myCollections之前myFuture必须是完整的。

请帮助我。

感谢

+0

'myFuture'是否必须返回'Future'?如果你不想使用'Future.await'或者返回'Future',我没有看到其他选项。 – adrice727

回答

3

这会返回一个future。如果你不在乎等待它是完整的,你可以随时访问使用.value潜在价值:

def INeedThatListBuffer(): Future[ListBuffer[String]] = { 

    def buildFutureFromDay(day: String): Future[String] = Future { ??? } 

    Future 
    .sequence(daysInAWeek.map(buildFutureFromDay)) 
    .map(_.foldLeft(ListBuffer[String]())(_ += _)) 

} 
+0

顺便说一句,你可以使用'_.to [ListBuffer]'方法来代替'_.foldLeft(...)'。 –

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的名单缓冲,因为它已经是可变的。