首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Java未来转换为Scala未来

将Java未来转换为Scala未来
EN

Stack Overflow用户
提问于 2016-01-27 09:23:26
回答 4查看 18K关注 0票数 26

我有一个Java Future对象,我想将它转换成一个Scala Future

看看j.u.c.Future API,除了isDone方法之外,我没有什么可以使用的了。这是isDone方法阻塞了吗?

目前,这就是我心中的想法:

代码语言:javascript
复制
val p = Promise()
if (javaFuture.isDone())
  p.success(javaFuture.get)

有更好的方法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-27 09:26:43

包装它怎么样(我假设这里有一个隐式ExecutionContext ):

代码语言:javascript
复制
val scalaFuture = Future {
    javaFuture.get
}

编辑:

简单的轮询策略可能如下所示(java.util.Future => F):

代码语言:javascript
复制
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的同一个线程中。

票数 21
EN

Stack Overflow用户

发布于 2019-03-30 08:40:49

在启动Scala 2.13时,标准库包括提供scala.jdk.FutureConverters到Scala CompletableFuture/Future隐式转换的scala.jdk.FutureConverters

代码语言:javascript
复制
import scala.jdk.FutureConverters._

// val javaFuture = java.util.concurrent.CompletableFuture.completedFuture(12)
val scalaFuture = javaFuture.asScala
// scalaFuture: scala.concurrent.Future[Int] = Future(Success(12))
票数 25
EN

Stack Overflow用户

发布于 2019-08-22 10:05:14

对于现在阅读此问题的人,如果您使用Scala2.13及以上版本,请使用:

代码语言:javascript
复制
import scala.jdk.FutureConverters._

并使用completableFuture.asScala进行转换

如果使用Scala2.12及以下版本,请使用

代码语言:javascript
复制
import scala.compat.java8.FutureConverters._

并使用:toScala(completableFuture)completableFuture.toScala进行转换

另外,在Scala2.12中,请确保您使用的是正确的工件:

代码语言:javascript
复制
org.scala-lang.modules:scala-java8-compat_2.12:0.9.0

现在,如果出于某种原因,您拥有的实际上是一个Future,而不是CompletableFuture,这应该是当今罕见的情况,请遵循以下的第一个答案:Transform Java Future into a CompletableFuture

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35033290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档