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

2022-09-01 16:45:25

Env: Akka 2.1, scala version 2.10.M6, JDK 1.7,u5

现在是我的问题:我有:

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

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

在阿卡中有什么方法吗?就我检查而言,我还没有找到任何东西...第一次有帖子....Sry对于糟糕的格式和组织... :~P


答案 1

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

答案 2

注意:自从Viktor Klang在2012年回答以来,他最近(2016年3月)在他的博客中为scala 2.12添加了:

缺少规范组合器:展平

你是我们未来的用户之一,他们已经厌倦了取消嵌套的未来的旧样板,如: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