我需要在未来附加到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)
}
答案 0 :(得分: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]]
答案 1 :(得分:0)
我认为你不应该使用mutable map
,因为你不知道这些未来何时完成。你只能通过检查map
的大小来检查是否匹配期货大小,但是如果有一个键是覆盖,你永远不知道什么时候期货已完成。
所以我认为您可以将Seq[Future[Int]]
fx
转换为Future[Seq[Int]]
而将map
转换为Future[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