Scala Futures:如何保证非空结果?
Scala Futures: How to guarantee a non-null result?
假设我有一个方法 returns CompleteableFuture[Data]
:
def doIt(): CompleteableFuture[Data] = { ... }
而且,doIt()
可以 return null
的可能性非零。我们如何在不阻塞调用线程的情况下调用 doIt()
直到结果不是 null
? Scala 中的方法是什么?
我目前的尝试:
Future {
var data: Data = null
blocking {
while (data == null) { data = doIt().get }
}
data
}
我不想使用 blocking
和 get
。有什么想法吗?
此外,还有 map
事后调用此 Future:
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
}
假设我有一个方法 returns CompleteableFuture[Data]
:
def doIt(): CompleteableFuture[Data] = { ... }
而且,doIt()
可以 return null
的可能性非零。我们如何在不阻塞调用线程的情况下调用 doIt()
直到结果不是 null
? Scala 中的方法是什么?
我目前的尝试:
Future {
var data: Data = null
blocking {
while (data == null) { data = doIt().get }
}
data
}
我不想使用 blocking
和 get
。有什么想法吗?
此外,还有 map
事后调用此 Future:
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
}