当前位置: 首页 > 知识库问答 >
问题:

将CompletableFuture (Java 8)转换为Future (Scala)

融修平
2023-03-14

我想将下面方法的返回类型更改为< code>Future[Unit]

def send(data: Array[Byte]): CompletableFuture[Void] = {
  val f:CompletableFuture[Void] = client.send(data)
  f
}

我使用的是Scala 2.12.1。是否有任何方便的方法可以将Java 8<code>CompletableFuture

共有3个答案

苗承
2023-03-14

要将CompletableFuture转换为Scala的未来并摆脱包装的CompletefulException::

package mycompany.common.concurrent

object Extensions {
  implicit class UnwrappedCompletableFuture[T](cf: CompletableFuture[T]) {

    import scala.jdk.FutureConverters._

    def toScala: Future[T] = {
      val f = cf.asScala
      f.recover {
        case ex: CompletionException if ex.getCause != null => throw ex.getCause
      }(ExecutionContext.global)
    }
  }
}

用法:

import mycompany.common.concurrent.Extensions._

val result = fetcher.fetchAsync().toScala.recover {
  case ex: YourActualException => 
}
寇涵容
2023-03-14

虽然asker(在2017年)提到了2.12,但现在我们有了2.13,转换变得更加容易:

从 Scala 2.13 开始,标准库包含 scala.jdk.FutureConverters,它提供了 Java 到 Scala CompletableFuture/Future 隐式转换:

import scala.jdk.FutureConverters._

val scalaFuture = javaFuture.asScala

将Java未来转换为Scala未来

羿博延
2023-03-14

是的,它叫做scala-java8-compat,这就是你要找的方法。

 类似资料:
  • 在我的项目中,我有一个Akka层,它返回一个,接收Future的部分是Java风格。 团队中的人不了解Scala,他们宁愿使用,因为他们更了解Java 8 API。 有没有什么好方法可以将一个转换成一个?。 显然是以非阻塞的方式。 当做

  • 问题内容: Java 8引入了可组合的Future的新实现(包括一堆thenXxx方法)。我想专门使用它,但是我想使用的许多库仅返回非可组合实例。 有没有一种方法可以将返回的实例包装在内,以便我可以编写它? 问题答案: 有一种方法,但是您不喜欢它。以下方法将a 转换为a : 显然,这种方法的问题在于,对于每个 Future ,都会阻塞线程以等待 Future 的结果-与 Future 的想法相矛盾

  • 我有一个方法,它返回CompletableFuture 但是当我调用第二个< code>doTransmit(notification,receivers,null)时。然后接受(列表- 我是概念的新手。但是,我知道Javascript Promises。请帮忙。

  • 在我的应用程序中,我正在将java.concurrent.future转换为Twitter Future,如下所示: 这是正确的做法吗,或者有更好的方法吗?

  • 我是java.time包的新手。我有一个本地日期是2015-12-10。我需要将此转换为ZonedDateTime。时间应该是00:00:00,区域是zoneoffset.utc。 dateTimeException:无法从java.time.localDate类型的TemporalAccessor:2015-12-10获取Instant 我也试过: 这会产生意想不到的结果。 我查看了API并尝试

  • 我试图使用以下公式将Future[Seq[(String,String)]转换为Future[Seq[(String)]: 所以 sortedSeq 是 Future[Seq[(String, String)]] 但我一直得到错误: 我做错了什么?