在打印变量之前等待将来结束

时间:2017-06-19 00:08:18

标签: scala

在这段代码中我需要打印变量seq,但由于它是在处理期货之前打印的,所以它打印为空。如何在执行语句seq之前等待填充变量println(seq)

object TestFutures5 extends App {

  def future (i:Int) = Future { i * 10 }
  val seq = Seq[Int]()

  for ( x <- 1 to 10 ) {
    val future2 = future(x) 
    future2.map {  y =>
       println(y)
       seq :+ y
    }
  }

  println(seq)  // <-- this always prints List()

  Thread.sleep(5000)
}

1 个答案:

答案 0 :(得分:1)

必须在所有期货完成后执行print语句,这意味着您需要存储对每个创建的未来的引用。您的序列也是不可变的,因此您无法向其中添加元素。如果你想在不改变变量的情况下这样做,你的循环应该像这样重构:

  val futureResult = (1 to 10).map {
    x =>
       future(x)
  }

然后只需使用Future.sequence对期货进行分组并进行打印:

Future.sequence(futureResult).map(res => println(res))