环境: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
简答(英文):flatMap dat sh!t
简短的回答(Scala):
flatMap(identity)
最短的答案:(Scala 2.12):
flatten
长答案(爪哇):
flatMap(new Mapper<Future<X>>,Future<X>>() {
@Override public Future<X> apply(final Future<X> f) { return f; }
})
注意:自从Viktor Klang在2012年回答以来,他最近(2016年3月)在他的博客中为scala 2.12添加了:
您是我们中的一员,
已经厌倦了旧的flatMap(身份)
样板来取消嵌套的未来,例如:
val future: Future[Future[X]] = ???
val flattenedFuture /*: Future[X] */ = future.flatMap(identity)
那我有好消息告诉你!从Scala 2.12开始< br > < code > 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
您可以创建其他任务
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.
});