Scala期货:如何保证非空结果?

时间:2018-08-05 16:12:02

标签: java scala asynchronous concurrency completable-future

假设我有一个返回CompleteableFuture[Data]的方法:

def doIt(): CompleteableFuture[Data] = { ... }

而且,doIt()返回null的可能性不为零。在不阻塞调用线程的情况下,如何调用doIt()直到结果为null为止? Scala中的方法是什么?

我当前的尝试:

Future {
  var data: Data = null
  blocking {
    while (data == null) { data = doIt().get }
  }
  data
} 

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

此外,事实发生后,有map对此未来的呼吁:

val myFuture = Future {
  var data: Data = null
  blocking {
    while (data == null) { data = doIt().get }
  }
  data
}.map { d => d.someMember } 
除非我们确保第一个d.someMember的结果为非null,否则

NullPointerException将抛出Future

1 个答案:

答案 0 :(得分:5)

使用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
  }