如何将未来的未来变成一个未来的对象?

时间:2012-08-08 08:48:53

标签: java scala sequence akka future

环境: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的对象的未来,有没有办法将它转换为Future而不阻塞我当前的线程?

akka有什么方法吗?据我检查,我还没发现任何...... 第一次有一个帖子.... Sry for bad format并组织......:〜P

3 个答案:

答案 0 :(得分:40)

简答(英文):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; }
})

答案 1 :(得分:10)

注意:自Viktor Klang的2012 answer以来,他最近(2016年3月)在his blog中添加了 scala 2.12

Missing canonical combinators: flatten

  

你是我们中的一员 Future - 使用旧版flatMap(identity)未使用嵌套期货的val future: Future[Future[X]] = ??? val flattenedFuture /*: Future[X] */ = future.flatMap(identity) 样板已经厌倦了:

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

然后我有一些好消息给你!从Scala 2.12开始   scala.concurrent.Future将采用具有以下签名的展平方法:

val future: Future[Future[X]] = ???
val flattenedFuture /*: Future[X] */ = future.flatten
  

允许你写:

lvalues

答案 2 :(得分:-1)

您可以创建另一个任务

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.
});