39

通常の Scala マップと flatMap は、flatMap がリストにフラット化されたデータの iterable を返すという点で異なります。しかし、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()

ここAkka先物でのmapとflatMapの違いは何ですか?

4

3 に答える 3

60

「通常の」Scala(あなたが言うように)では、マップとフラットマップはリストとは何の関係もありません(たとえば、オプションを確認してください)。

アレクセイはあなたに正しい答えを出しました。では、なぜ両方が必要なのかを知りたい場合は、for先物を構成するときに便利な構文を使用できます。次のようなものが与えられます:

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

コンパイラはそれを次のように書き換えます。

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

メソッドのシグネチャに従うと、式が type の何かを返すことがわかるはずですFuture[A]

map のみが使用されたと仮定すると、コンパイラーは次のようなことを行うことができます。

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

ただし、結果のタイプはFuture[Future[A]]. そのため、平らにする必要があります。

背後にある概念について学ぶために、私が読んだ中で最高の紹介の 1 つを次に示します。

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

于 2011-07-14T06:52:56.790 に答える
35

ここAkka先物でのマップとフラットマップの違いは何ですか?

タイプ、基本的に:

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

map[A](f: T => A): Future[A] 
于 2011-07-14T06:13:10.053 に答える