java - 斯卡拉 future : How to guarantee a non-null result?

标签 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 事后对这个 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
  }

关于java - 斯卡拉 future : How to guarantee a non-null result?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51696046/

相关文章:

java - 如何使用 NameValuePair 将数组值发送到 servlet?

java - 有没有支持存储过程的内存数据库?

c# - 异步数据读取器和执行顺序

c# - 有没有办法知道是否正在等待任务?

java - 检查方法 "return null"是否为 @Nullable

java - JFrame Java setColor 和 fillRect 保持空白?

scala - 如何匹配一组可能的值?

scala - 在 Scala 中组合两个 Option[List[String]]

scala - 如何创建可应用于包含相同参数的两种或多种类型的泛型函数?

java - 何时线程。何时不使用线程