在普通的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
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)