可以在Future.sequence中访问包含Future的对象

时间:2017-06-19 16:23:01

标签: scala

我在Scala中有以下功能:

object TestFutures5 extends App {

  def future (i:Int) = Future { i * 10 }
  var rnd = scala.util.Random

  val futureResult = (1 to 10).map {
     x =>
       val y = rnd.nextInt(x)
      (future(x),y)  // <- this should return a future 
                     // as it needs to be processed by Future.sequence
   }

   Future.sequence(futureResult).foreach(list => println(list)) // <- this does not compile


  Thread.sleep(5000)
}

Future.sequence函数中,我需要访问future(x)和每个变量y的结果,但由于sequence仅适用于期货,因此此代码无法编译。如何重构/修复它?

2 个答案:

答案 0 :(得分:4)

您只需将y添加到未来的结果中:

future(x).map(res => (res, y))

您的序列现在将包含一个元组列表,其结果和值y

答案 1 :(得分:1)

使用traverse

Future.traverse(futureResult)(pair => pair._1.map(result => (pair._2, result)))

映射每个未来,以便结果具有y值。

Future.traverse(futureResult)(pair => pair._1.map(result => (pair._2, Right(result))).recover { case th => (pair._2, Left(th)) })

要在失败时获取y值,请使用恢复。

所以,总结一下。您正在使用y作为未来计算的标记或索引,以便您可以了解标记失败的未来。

y可作为未来的标记或名称。

Scala REPL

scala> Future.traverse(futureResult)(pair => pair._1.map(result => (pair._2, Right(result))).recover { case th => (pair._2, Left(th)) })
result: scala.concurrent.Future[scala.collection.immutable.IndexedSeq[(Int, scala.util.Either[Throwable,Int])]] = Future(<not completed>)