2017-06-19 26 views
0

我在斯卡拉以下功能:有在Future.sequence访问对象包含未来

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仅适用于期货,此代码不能编译。如何重构/修复它?

回答

4

你可以只添加y未来的结果:

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

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

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作为未来的标签或名称。

斯卡拉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>)