Env: Akka 2.1, scala version 2.10.M6, JDK 1.7,u5
Now is my problem: I have:
future1 = Futures.future(new Callable>(){...
Short answer (English): flatMap dat sh!t
Shorter answer (Scala):
flatMap(identity)
Shortest answer: (Scala 2.12):
flatten
Long answer (Java):
flatMap(new Mapper<Future<X>>,Future<X>>() {
@Override public Future<X> apply(final Future<X> f) { return f; }
})
Note: Since Viktor Klang's 2012 answer, he recently (March 2016) added in his blog for scala 2.12:
Are you one of us Future-users who have grown tired of the old
flatMap(identity)
boilerplate for un-nesting Futures as in:
val future: Future[Future[X]] = ???
val flattenedFuture /*: Future[X] */ = future.flatMap(identity)
Then I have some great news for you! Starting with Scala 2.12
scala.concurrent.Future will have a flatten-method with the following signature:
def flatten[S](implicit ev: T <:< Future[S]): Future[S]
Allowing you to write:
val future: Future[Future[X]] = ???
val flattenedFuture /*: Future[X] */ = future.flatten
You can create another task
Futures.future(new Runnable(){
// wait for future1
// wait for future2
// do something with the results.
});
or merge the tasks
Futures.future(new Runnable(){
// do the work future2 would have done.
// wait for future1
// do something with the results.
});