我是scala的初学者。我按如下方式执行一些代码。 我认为结果将是“Hello1”。
val testFuture: Future[Seq[String]] = Future {
var res = Seq.empty[String]
res = res :+ "hello1"
res
}
val testFuture1:Future[Seq[String]] = Future {
var test = Seq.empty[String]
test = test :+ "kkkkkkkkk"
test
}
val result = for {
restFu1 <- testFuture
restFu2 <- testFuture1
if(restFu1 != restFu2)
} yield restFu1
result onSuccess {
case result => println("***************"+ result)
}
result onFailure {
case _ => println ("************ fail........" )
}
但实际上,结果一无所获。谁知道原因。
答案 0 :(得分:1)
如果你在REPL中运行它,你将得到你期望的结果
scala> ***************List(hello1)
如果您从IDE运行它,那么您可能看不到输出,因为Future
是在一个单独的线程上安排的,并且您的程序在该线程有机会运行之前终止。在这种情况下,有几种方法可以阻止程序终止:
val res = Await.result(result, 1 second)
// or
val cbF = result onSuccess {
case result => println("***************"+ result)
}
Await.ready(cbF, 1 second)
请注意,在第一种情况下,您实际获得的结果并不需要安排回调,因此您需要在主程序流程中使用println
。在第二种情况下,您只对副作用感兴趣,因此使用ready
方法。请注意,为了保证执行println
,您需要等待回调的未来。
最后,使用Await
进行测试/学习很好,但在生产代码中使用它通常是一个坏主意。
答案 1 :(得分:0)
当你使用Future时,你实际上是在另一个线程中运行计算,而你的程序的主线程只是启动它们然后因为没有什么可以做主线程退出和程序终止, 只需将Thread.sleep和你的程序结束,使主线程等待1秒,你应该看到结果
Thread.sleep(1000)