在Scala Akka期货中,map和flatMap有什么区别?

在普通的Scala中,map和flatMap是不同的,flatMap会将数据的迭代返回到列表中。 但是在Akka文档中,map和flatMap似乎有所不同呢?

http://akka.io/docs/akka/1.1/scala/futures.html

它说:“通常情况下,这很好地工作,因为它意味着运行一个快速函数的开销很小,如果函数有可能花费不less的时间来处理,那么最好同时完成这个工作,为此我们使用flatMap:“

val f1 = Future { "Hello" + "World" } val f2 = f1 flatMap {x => Future(x.length) } val result = f2.get() 

有人可以解释阿卡期货在这里的地图和flatMap有什么区别吗?

在“正常”的斯卡拉(正如你所说),地图和flatMap与列表无关(例如检查选项)。

阿列克谢给你正确的答案。 现在,如果你想知道为什么我们需要两者,那么在编写期货的时候就可以使用语法。 给定类似于:

 val future3 = for( x <- future1; y <- future2 ) yield ( x + y ) 

编译器将其重写为:

 val future3 = future1.flatMap( x => future2.map( y => x+y ) ) 

如果你遵循方法签名,你应该看到expression式将返回Future[A]types的东西。

假设现在只有地图被使用了,编译器可以做到这样的事情:

 val future3 = future1.map( x => future2.map( y => x+y ) ) 

然而,结果是typesFuture[Future[A]] 。 这就是为什么你需要扁平化。

要了解背后的概念,这里是我读过的最好的介绍:

http://www.codecommit.com/blog/ruby/monads-are-not-metaphors

有人可以解释阿卡期货在这里的地图和flatMap有什么区别吗?

types,基本上是:

 flatMap[A](f: T => Future[A]): Future[A] map[A](f: T => A): Future[A] 

我正在粘贴这两种方法的实现。 英文中的差异在下面, 并返回函数的结果作为新的未来

  /** Creates a new future by applying a function to the successful result of * this future. If this future is completed with an exception then the new * future will also contain this exception. * * $forComprehensionExamples */ def map[S](f: T => S)(implicit executor: ExecutionContext): Future[S] = { // transform(f, identity) val p = Promise[S]() onComplete { v => p complete (v map f) } p.future } /** Creates a new future by applying a function to the successful result of * this future, and returns the result of the function as the new future. * If this future is completed with an exception then the new future will * also contain this exception. * * $forComprehensionExamples */ def flatMap[S](f: T => Future[S])(implicit executor: ExecutionContext): Future[S] = { import impl.Promise.DefaultPromise val p = new DefaultPromise[S]() onComplete { case f: Failure[_] => p complete f.asInstanceOf[Failure[S]] case Success(v) => try f(v) match { // If possible, link DefaultPromises to avoid space leaks case dp: DefaultPromise[_] => dp.asInstanceOf[DefaultPromise[S]].linkRootOf(p) case fut => fut.onComplete(p.complete)(internalExecutor) } catch { case NonFatal(t) => p failure t } } p.future } 

从实现的不同之处在于,当promise完成的时候,flatMap实际上调用了带有结果的函数。

 case Success(v) => try f(v) match 

对于一个伟大的文章阅读:http // danielwestheide.com /博客/ 2013/01/16 /新手指南斯卡拉部分9承诺和期货实践。