首页 > 解决方案 > Scala Futures:如何保证非空结果?

问题描述

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

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

而且,有一个非零的机会doIt()可以返回null。我们如何调用doIt(),直到结果不是null没有阻塞调用线程?Scala中的方法是什么?

我目前的尝试:

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

我宁愿不使用blockingand get。有任何想法吗?

此外,map事后有人呼吁这个未来:

val myFuture = Future {
  var data: Data = null
  blocking {
    while (data == null) { data = doIt().get }
  }
  data
}.map { d => d.someMember } 

d.someMemberNullPointerException除非我们确保第一个Future有非空结果, 否则将抛出一个。

标签: javascalaasynchronousconcurrencycompletable-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
  }

推荐阅读