sab*_*bee 1 java concurrency asynchronous scala completable-future
假设我有一个返回的方法CompleteableFuture[Data]:
def doIt(): CompleteableFuture[Data] = { ... }
Run Code Online (Sandbox Code Playgroud)
而且,有一个非零的机会doIt()可以回归null.我们如何调用,doIt()直到结果不是null没有阻塞调用线程?Scala的方法是什么?
我目前的尝试:
Future {
var data: Data = null
blocking {
while (data == null) { data = doIt().get }
}
data
}
Run Code Online (Sandbox Code Playgroud)
我宁愿不使用blocking和get.有任何想法吗?
此外,map在事实发生后,有人呼吁这个未来:
val myFuture = Future {
var data: Data = null
blocking {
while (data == null) { data = doIt().get }
}
data
}.map { d => d.someMember }
Run Code Online (Sandbox Code Playgroud)
d.someMemberNullPointerException除非我们确保第一个Future具有非null结果,否则将抛出a .
使用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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |