0

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

val myTwitterFuture = FuturePool.unboundedPool{ myJavaFuture.get}

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

4

1 回答 1

1

如果你的 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 }
  }
}
于 2020-02-14T20:44:52.320 回答