scala - 将 Java Future 转换为 Twitter Future 的最佳方法
问题描述
在我的应用程序中,我将 java.concurrent.future 转换为 Twitter Future,如下所示:
val myTwitterFuture = FuturePool.unboundedPool{ myJavaFuture.get}
这是这样做的正确方法,还是有首选方法?
解决方案
如果你的 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 }
}
}
推荐阅读
- spring - 配置自定义权限评估器时如何避免警告消息“不符合所有 BeanPostProcessors 处理的条件”消息
- c# - `return` 后面的 `(int)` 是什么意思
- android - Android Kotlin - 使用一对多实体关系时出错
- reactjs - 从单独的文件中导入状态
- javascript - 如何可视化更新和稍后回滚 JavaScript 更新事务
- python-3.x - 如何修复matplotlib图中的重叠线
- python - 尝试在 Jupyter Notebook 上使用 Pandas 从现有列创建新列时出现 NoneType 错误
- python - 文件作为 argparse 的命令行参数 - 如果参数为空,则会出现错误消息
- java - java窗口更新延迟,如何快速响应?
- laravel - Laravel:如何在转义的控制器文本中打印出数组中的字符串