未来地图是否懒惰?

时间:2018-11-03 15:57:10

标签: scala future

基本上我是说:

for(v <- Future(long time operation)) yield v*someOtherValue

此表达式返回另一个Future,但问题是v*someOhterValue操作是否是惰性的?该表达式会阻塞获取Future(long time operation)的值吗?

还是像一连串的回调?

3 个答案:

答案 0 :(得分:3)

简短的实验可以测试这个问题。

import concurrent._;
import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

object TheFuture {

  def main(args: Array[String]): Unit = {
    val fut = for (v <- Future { Thread.sleep(2000) ; 10 }) yield v * 10;
    println("For loop is finished...")
    println(Await.ready(fut, Duration.Inf).value.get);
  }

}

如果运行此命令,则几乎立即看到For loop is finished...,然后两秒钟后,我们看到结果。因此,将来执行map或类似操作的行为不会受到阻碍。

答案 1 :(得分:2)

Future上的映射(或等效地,您的理解)不是不是惰性的:它将尽快在另一个线程上执行。但是,由于它在另一个线程上运行,因此也不会阻塞。

答案 2 :(得分:0)

如果要分别进行Future的定义和执行,则必须使用Monix Task之类的东西。

https://monix.io/api/3.0/monix/eval/Task.html