2017-07-07 3 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

だから私は、あなたがこれらの先物が行われたときに知っているし、他のいくつかのことを行うことができますので、あなたのような、Future[Map[Int, String]]にそれをFuture[Seq[Int]]fxSeq[Future[Int]]を変換し、mapことができると思います結果は不変の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のサイズをチェックすることによってのみ行うことができますが、先物が完了したときは、オーバーライドキーがある場合はわかりません。ここで取得するための一つの方法だ

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 
関連する問題