2017-08-29 11 views
-1

ループで呼び出されたスカラでリストバッファが構築された場合に、リストバッファを取得する方法について悩まされています。ここで変数を変更するためにスカラーが将来待たされる

は私の問題は時々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 
} 

キス例です。明らかに、このメソッドは、未来が評価される前に完了しています。ただ、私はmyCollectionsが評価される前に、myFutureが完了していなければならないという結合がないので今後のobjが動作しないようmyCollectionsを渡すfuture.await

  • を使用したくない

    1. を追加する

    親切にお手伝いします。

    おかげ

  • +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

    ところで、 '_.foldLeft(...)'の代わりに '_.to [ListBuffer]'メソッドを使うことができます。 –

    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であることができますよう。

    関連する問題