java - Scala Futures:如何保证非空结果?
问题描述
假设我有一个返回的方法CompleteableFuture[Data]
:
def doIt(): CompleteableFuture[Data] = { ... }
而且,有一个非零的机会doIt()
可以返回null
。我们如何调用doIt()
,直到结果不是null
没有阻塞调用线程?Scala中的方法是什么?
我目前的尝试:
Future {
var data: Data = null
blocking {
while (data == null) { data = doIt().get }
}
data
}
我宁愿不使用blocking
and get
。有任何想法吗?
此外,map
事后有人呼吁这个未来:
val myFuture = Future {
var data: Data = null
blocking {
while (data == null) { data = doIt().get }
}
data
}.map { d => d.someMember }
d.someMember
NullPointerException
除非我们确保第一个Future
有非空结果, 否则将抛出一个。
解决方案
使用https://github.com/scala/scala-java8-compat:
import scala.compat.java8.FutureConverters._
def doItNotNull: Future[Data] =
doIt.toScala.flatMap {result =>
if (result == null) doItNotNull // try again
else Future.successful(result) // wrap in a completed future
}
推荐阅读
- php - 致命错误:未捕获的类型错误:count():参数 #1 ($var) 必须是 Countable|array 类型,在
- c# - Entity Framework 6 不能选择所有列,只能选择一个子集
- mocking - SoapUI:一次运行多个具有相同端口和路径的 Soap Mock 服务
- android - Android Lint 消息:更新到 Fragment 1.3.0 以在分析/检查代码中使用 ActivityResult API 错误
- laravel - Laravel 关系,需要建议
- python-3.x - 循环页面并将详细内容保存为 Python 中的数据框
- python - 我可以使用 spacy 在字符串中识别“问题词”(谁,如何,何时......)?
- javascript - 注销后如何清除浏览器缓存(内存/磁盘缓存)?
- r - 使特征返回不同的类
- web - 静态 Markdown 网站的实时服务器