2017-08-29 61 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的名單緩衝,因爲它已經是可變的。