Convert scala future to java future

后端 未结 3 2254
迷失自我
迷失自我 2021-02-19 09:18

I have a generated java interface containing a method:

public Future getCustomersAsync(AsyncHandler asyncHandler);

I w

相关标签:
3条回答
  • 2021-02-19 09:48

    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>
    
    0 讨论(0)
  • 2021-02-19 09:59

    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

    0 讨论(0)
  • 2021-02-19 10:05

    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

    0 讨论(0)
提交回复
热议问题