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

Phi*_*hil 38 scala akka

在普通的Scala map和flatMap中,flatMap将返回一个可迭代的数据,这些数据被展平为一个列表.但是在Akka文档中,map和flatMap似乎做了不同的事情?

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

它说"通常这很有效,因为这意味着运行快速功能的开销非常小.如果该功能有可能花费很多时间来处理它,那么同时完成这项工作可能会更好,为此,我们使用flatMap:"

val f1 = Future {
  "Hello" + "World"
}

val f2 = f1 flatMap {x =>
  Future(x.length)
}

val result = f2.get()
Run Code Online (Sandbox Code Playgroud)

有人可以解释Akka期货中地图和flatMap之间的区别吗?

par*_*tic 60

在"普通"Scala中(如你所说),map和flatMap与Lists无关(例如选中Option).

阿列克谢给了你正确答案.现在,如果你想知道为什么我们需要两者,它for在编写期货时允许很好的语法.给出如下内容:

val future3 = for( x <- future1;
                   y <- future2 ) yield ( x + y )
Run Code Online (Sandbox Code Playgroud)

编译器将其重写为:

val future3 = future1.flatMap( x => future2.map( y => x+y ) )
Run Code Online (Sandbox Code Playgroud)

如果您遵循方法签名,您应该看到表达式将返回某种类型Future[A].

假设现在只使用了map,编译器可以做类似的事情:

val future3 = future1.map( x => future2.map( y => x+y ) )
Run Code Online (Sandbox Code Playgroud)

但是,结果应该是类型的Future[Future[A]].这就是你需要压扁它的原因.

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

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

  • 我没有意识到flatten可以压扁类型,我的想法是它将一个对象列表扁平化为一个列表.因此,从我的"旧"思想来看,我认为它只是走到了名单上并将其弄平了.实际上,flatten可以压缩类型,就像你说的Future [Future [A]]类似于List [List [A]].一旦我迈出这一步,我就能更好地理解它. (7认同)

Ale*_*nov 35

有人可以解释Akka期货中地图和flatMap之间的区别吗?

类型,基本上:

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

map[A](f: T => A): Future[A] 
Run Code Online (Sandbox Code Playgroud)