我有一个Java Future对象,我想将它转换成一个Scala Future。
看看j.u.c.Future API,除了isDone方法之外,我没有什么可以使用的了。这是isDone方法阻塞了吗?
目前,这就是我心中的想法:
val p = Promise()
if (javaFuture.isDone())
p.success(javaFuture.get)有更好的方法吗?
发布于 2016-01-27 09:26:43
包装它怎么样(我假设这里有一个隐式ExecutionContext ):
val scalaFuture = Future {
javaFuture.get
}编辑:
简单的轮询策略可能如下所示(java.util.Future => F):
def pollForResult[T](f: F[T]): Future[T] = Future {
Thread.sleep(500)
f
}.flatMap(f => if (f.isDone) Future { f.get } else pollForResult(f))这将检查Java未来是否每500 is完成一次。显然,总阻塞时间与上面相同(舍入最近的500 as ),但此解决方案将允许将其他任务交织在ExecutionContext的同一个线程中。
发布于 2019-03-30 08:40:49
在启动Scala 2.13时,标准库包括提供scala.jdk.FutureConverters到Scala CompletableFuture/Future隐式转换的scala.jdk.FutureConverters:
import scala.jdk.FutureConverters._
// val javaFuture = java.util.concurrent.CompletableFuture.completedFuture(12)
val scalaFuture = javaFuture.asScala
// scalaFuture: scala.concurrent.Future[Int] = Future(Success(12))发布于 2019-08-22 10:05:14
对于现在阅读此问题的人,如果您使用Scala2.13及以上版本,请使用:
import scala.jdk.FutureConverters._并使用completableFuture.asScala进行转换
如果使用Scala2.12及以下版本,请使用
import scala.compat.java8.FutureConverters._并使用:toScala(completableFuture)或completableFuture.toScala进行转换
另外,在Scala2.12中,请确保您使用的是正确的工件:
org.scala-lang.modules:scala-java8-compat_2.12:0.9.0现在,如果出于某种原因,您拥有的实际上是一个Future,而不是CompletableFuture,这应该是当今罕见的情况,请遵循以下的第一个答案:Transform Java Future into a CompletableFuture
https://stackoverflow.com/questions/35033290
复制相似问题