未来

时间:2017-07-07 00:29:05

标签: scala

我需要在未来附加到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)
}

2 个答案:

答案 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