I have a generated java interface containing a method:
public Future> getCustomersAsync(AsyncHandler asyncHandler);
I w
Starting Scala 2.13
, the standard library includes scala.jdk.FutureConverters which provides Scala to Java Future
conversions (and vice versa):
import scala.jdk.FutureConverters._
// val scalaFuture: scala.concurrent.Future[Int] = Future.successful(42)
scalaFuture.asJava
// java.util.concurrent.CompletionStage[Int] = <function1>
Note for Java users, you'd rather use FutureConverters
the explicit way:
import scala.jdk.javaapi.FutureConverters;
// val scalaFuture: scala.concurrent.Future[Int] = Future.successful(42)
FutureConverters.asJava(scalaFuture);
// java.util.concurrent.CompletionStage[Int] = <function1>
Well its not practical to convert them, because scala Future
do not provide functionality to interrupt or any other mechanism for cancellation. So there is no direct full-proof way to cancel a future via interruption or otherwise via method call in Future.
So the simplest solution can be if cancellation is not desired would be:
def convert[T](x:Future[T]):java.util.concurrent.Future[T]={
new concurrent.Future[T] {
override def isCancelled: Boolean = throw new UnsupportedOperationException
override def get(): T = Await.result(x, Duration.Inf)
override def get(timeout: Long, unit: TimeUnit): T = Await.result(x, Duration.create(timeout, unit))
override def cancel(mayInterruptIfRunning: Boolean): Boolean = throw new UnsupportedOperationException
override def isDone: Boolean = x.isCompleted
}
}
But in case if you still need cancel
, a handicapped fix would be as shown
here. But I wouldn't recommend it though as its shaky
I don't think that there is a easy way to convert scala Future to java Future. One possible solution is to wrap scala future by java future but you must pass a new task to the thread pool, see java docs: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html