Лучший способ превратить будущее Java в будущее Twitter
В своем приложении я конвертирую java.concurrent.future в Twitter Future следующим образом:
val myTwitterFuture = FuturePool.unboundedPool{ myJavaFuture.get}
Это правильный способ сделать это или есть другой предпочтительный метод?
1 ответ
Решение
Если ваше будущее Java - это просто java.util.concurrent.Future
, то то, что у вас есть, в основном лучшее, что вы можете сделать, потому что это очень плохой тип. Если у тебя естьjava.util.concurrent.CompletableFuture
, вы в основном объединяете ответы, чтобы преобразовать его вscala.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 }
}
}