我想将以下方法的返回类型更改为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,转换变得更加容易:
从 Scala2.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 =>
}