首页 > 解决方案 > 将 Java Future 转换为 Twitter Future 的最佳方法

问题描述

在我的应用程序中,我将 java.concurrent.future 转换为 Twitter Future,如下所示:

val myTwitterFuture = FuturePool.unboundedPool{ myJavaFuture.get}

这是这样做的正确方法,还是有首选方法?

标签: scalatwitter-util

解决方案


如果你的 Java 未来只是一个java.util.concurrent.Future,那么你所拥有的基本上是你能做的最好的,因为它是一个非常糟糕的类型。如果你有 a java.util.concurrent.CompletableFuture,你基本上结合了将其转换为 ascala.concurrent.Future并将Scala 未来转换为 Twitter 未来的答案:

import java.util.concurrent.{Future => JFuture, CompletableFuture}
import com.twitter.util.{Future => TwitterFuture, Promise => TwitterPromise}
import scala.util.{Success, Failure}

implicit class FutureWrapper[A](private val jf: JFuture[A]) extends AnyVal {
  def asTwitter: TwitterFuture[A] = jf match {
    case jf: CompletableFuture[A] =>
      val promise = new TwitterPromise[A]()
      jf.whenComplete { (result, exception) =>
        if (exception != null)
          promise.setException(exception)
        else
          promise.setValue(result)
      }
      promise
    case _ =>
      FuturePool.unboundedPool{ jf.get }
  }
}

推荐阅读