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



我想将以下方法的返回类型更改为Future[Unit]

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

我正在使用 Scala 2.12.1。有没有方便的方法可以从Java 8 CompletableFuture转换为Scala的Future

是的,它被称为scala-java8-compat,这是你正在寻找的方法。

虽然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 的未来

要将 CompletableFuture 转换为 Scala's Future 并摆脱包装 CompletionException:

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 => 
}

最新更新