在这段代码中我需要打印变量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)
}
答案 0 :(得分:1)
必须在所有期货完成后执行print语句,这意味着您需要存储对每个创建的未来的引用。您的序列也是不可变的,因此您无法向其中添加元素。如果你想在不改变变量的情况下这样做,你的循环应该像这样重构:
val futureResult = (1 to 10).map {
x =>
future(x)
}
然后只需使用Future.sequence
对期货进行分组并进行打印:
Future.sequence(futureResult).map(res => println(res))