有趣的地图和flatMap观察 - 未来,斯卡拉

我注意到了有关的地图,flatMap和未来几个有趣的行为,但我无法理解是什么原因造成这种现象有趣的地图和flatMap观察 - 未来,斯卡拉

//I have 3 Future objects. 

object ConcurrencyExample extends App {

val time = System.currentTimeMillis()

val future1 = Future{println("future1");1}

val future2 = Future{println("future2");2}

val future3 = Future{println("future3");3}

//I want to add 1,2 and 3. I can do it using flatMap

val result = future1 flatMap (f1=> future2.flatMap(f2 => future3.map(f3=> f3+f2+f1)))

result onComplete{

case Success(v)=>println("result is "+v)

case Failure(e) =>println("failed result:"+e)

}

Thread.sleep(1000)

}

结果

future2 

future1

future3

result is 6

如果我将上面的代码更改为map,我会得到一个空的List()。我无法跟踪这个空列表来自哪里?

val result = future1 map (f1=> future2.map(f2 => future3.map(f3=> f3+f2+f1))) 

结果

future3 

future2

future1

result is List()

如果我只用两个未来的对象和地图,我获得成功(3),而不是一个空列表()

val result = future1 map (f1=> future2.map(f2 => f2+f1)) 

结果

future3 

future2

future1

result is Success(3)

回答:

在第一种情况下,结果返回类型是Future[Int],在第二种情况下,结果返回类型为Future[Future[...]](一些嵌套未来)

在第一种情况下,当你做的onComplete是

val result: Future[Int] = ??? 

result onComplete { println }

上面的代码将返回Success(1)

在第二种情况

val result: Future[Future[..]] = ??? 

result onComplete { println }

这可能会导致不计算未来,这就是为什么你看到List()。请参阅下面的Scala repl输出。看看结果类型Future { Thread.sleep(1000); 1 }

scala> import scala.concurrent.ExecutionContext.Implicits.global 

import scala.concurrent.ExecutionContext.Implicits.global

scala> val f = Future { Thread.sleep(1000); 1 }

f: scala.concurrent.Future[Unit] = List()

scala> f onComplete { println }

Success(1)

建议

知道flatMap之间的差异,地图和知道什么时候使用flatMap和地图。

以上是 有趣的地图和flatMap观察 - 未来,斯卡拉 的全部内容, 来源链接: utcz.com/qa/265479.html

回到顶部