2017-07-07 43 views
0

我需要追加到Map結構從未來,我找不到一種方法使Map不可變(見下文)。恐怕如果Map是可變的,那麼我將有一個競賽條件。如何修復下面的代碼?未來競爭條件追加到可變映射

object TestFutures extends App { 

    val m = collection.mutable.Map[Int,String]() 

    val f0 = Future { 0 } 
    val f1 = Future { 1 } 
    val f2 = Future { 2 } 
    val f3 = Future { 3 } 
    val f4 = Future { 4 } 

    val fx = Seq(f0,f1,f2,f3,f4) 

    fx.map { 
    i => 
     i.map { 
     x => 
      val s = x + "" 
      m += (x -> s) 
    } 
    } 

    Thread.sleep(5000) 
    println(m) 
} 

回答

1

這裏得到的一種方式結果作爲不可變的Map

val fx = Future.sequence(Seq(f0,f1,f2,f3,f4)) 
       .map(_.map(i => i -> s"$i").toMap) 
//fx: Future[scala.collection.immutable.Map[Int,String]] 
0

我不認爲你應該使用mutable map對於這一點,因爲當這些期貨做,你可以不知道。你只能通過檢查map的大小,以檢查是否匹配期貨尺寸做的,但如果有一個關鍵是覆蓋,當期貨完成你永遠不知道。

所以我認爲你可以轉換的fxSeq[Future[Int]]Future[Seq[Int]]mapFuture[Map[Int, String]],這樣你就可以知道什麼時候這些期貨做和做一些其他的事情,比如:

val res: Future[Map[Int, String]] = Future.sequence(fx).map(s => s.map(i => (i, i.toString)).toMap) // this will generate a immutable variable 
val r: Map[Int, String] = Await.wait(res, Duration.Inf) //!!! Await just for test purpose