我在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
仅适用于期货,因此此代码无法编译。如何重构/修复它?
答案 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>)