25

Env:Akka 2.1、scalaバージョン2.10.M6、JDK 1.7、u5

今が私の問題です:私は持っています:

future1 = Futures.future(new Callable<Future<object>>(){...});
future2 = ? extends Object;
Future.sequence(future1, future2).onComplete(...)

今最初の行に、Future of objectがありますが、現在のスレッドをブロックせずに、Futureに変換する方法はありますか?

akkaに方法はありますか?私がチェックした限り、私はまだ何も見つけていません...投稿をするのは初めてです....悪いフォーマットを探して整理してください...:〜P

4

3 に答える 3

51

短い答え(英語):flatMap dat sh!t

短い答え(Scala):

flatMap(identity)

最短の答え:(Scala 2.12):

flatten

長い答え(Java):

flatMap(new Mapper<Future<X>>,Future<X>>() {
  @Override public Future<X> apply(final Future<X> f) { return f; }
})
于 2012-08-08T09:15:49.240 に答える
11

注:Viktor Klangの2012年の回答以来、彼は最近(2016年3月)scala2.12のブログ に追加しました。

欠落している正規のコンビネータ:flatten

あなたは私たちの一人ですか?次のように、ネストされていない先物Futureの古い定型文に飽きてきたユーザーです。flatMap(identity)

val future: Future[Future[X]] = ???
val flattenedFuture /*: Future[X] */ = future.flatMap(identity)

それでは、すばらしいニュースがあります。Scala 2.12以降
scala.concurrent.Futureでは、次のシグネチャを持つflattenメソッドが使用されます。

def flatten[S](implicit ev: T <:< Future[S]): Future[S]

あなたが書くことを可能にする:

val future: Future[Future[X]] = ???
val flattenedFuture /*: Future[X] */ = future.flatten
于 2016-03-18T08:24:27.273 に答える
-3

別のタスクを作成できます

Futures.future(new Runnable(){
     // wait for future1
     // wait for future2
     // do something with the results.
});

またはタスクをマージします

Futures.future(new Runnable(){
     // do the work future2 would have done.
     // wait for future1
     // do something with the results.
});
于 2012-08-08T08:52:38.393 に答える