将 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 }
}
}
在我的应用程序中,我正在将 java.concurrent.future 转换为 Twitter Future,如下所示:
val myTwitterFuture = FuturePool.unboundedPool{ myJavaFuture.get}
这是这样做的正确方法,还是有更好的方法?
如果你的Java未来只是一个java.util.concurrent.Future
,那么你所拥有的基本上就是你能做到的最好的,因为它是一种非常糟糕的类型。如果你有一个java.util.concurrent.CompletableFuture
,你基本上把答案组合到
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 }
}
}