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
} 

我不想使用 blockingget。有什么想法吗?

此外,还有 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
  }