25

环境: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(...)

现在在第一行,我有一个未来的对象,有没有办法在不阻塞我当前线程的情况下将它转换为未来?

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 月)在他的博客中添加 了scala 2.12

缺少规范组合器:flatten

您是我们中的一Future员吗?已经厌倦了flatMap(identity)取消嵌套期货的旧样板的用户,例如:

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

那么我有一个好消息要告诉你!从 Scala 2.12 开始,
scala.concurrent.Future将有一个带有以下签名的 flatten-method:

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 回答