Scala Futures and java 8 CompletableFuture
akka, java, java-8, scala
Solution
What are the differences, and why a Scala developer should prefer Scala Futures over java 8 CompletableFuture ?
Rephrasing what @dk14 pointed out in comments I'd say that `CompletableFuture` doesn't have idiomatic Scala api.
For scala developer the implications are:
- lack of for comprehensions due to fact that it does not follow Scala method conventions common for monadic types
- java-scala interop overhead needed when using big part of it's methods
It is also worth noting that java `CompletableFuture` is not exactly equivalent of scala `Future`. It is rather a fuse of scala `Future` and `Promise`.
Considering the cons listed above there isn't much sense in using `CompletableFuture` in scala unless you are designing public api that should be seamlessly interoperable with java.
Are there still good reasons to use the scala.concurrent.Future in Java through akka.dispatch bridge?
I am particularly looking for reasons to use akka.dispatch in Java, if there are still any
Akka is build on top of scala and it sometimes uses scala `Future`s. This means that in cases when you have some portion of code written in java it is worth to wrap it in scala api (with `akka.dispatch` java api) to be able to easily use it with akka.
For example, you are implementing akka actor in java. When processing message you want to do some non-blocking reading that, when done, should produce result as a message to another actor.
What you could do is to put your I/O into java Callable, then use akka.dispatch.Futures#future to get scala `Future` out of it, and then you could leverage akka pipe to make result of the future be delivered as a message to some actor.
Problem
The introduction of `CompletableFutures` in Java 8 brought to the language features available in the `scala.concurrent.Future` such as monadic transformations. What are the differences, and why a Scala developer should prefer Scala Futures over java 8 `CompletableFuture` ? Are there still good reasons to use the `scala.concurrent.Future`in Java through `akka.dispatch` bridge?