将 Java Future 转换为 Twitter Future 的最佳方式

Best way to convert a Java Future to a Twitter Future

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

val myTwitterFuture = FuturePool.unboundedPool{ myJavaFuture.get}

这是这样做的正确方法,还是有更好的方法?

如果你的Java未来只是一个java.util.concurrent.Future,那么你所拥有的基本上就是你能做到的最好的,因为它是一种非常糟糕的类型。如果你有一个java.util.concurrent.CompletableFuture,你基本上把答案组合到 and convert Scala future to a Twitter future:

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