Scala 如何检查未来是否为空
下面的代码返回一个Scala 如何检查未来是否为空,scala,Scala,下面的代码返回一个未来 val findUserFuture: Future[Option[User]] = userRepo.findOne(userKeys) 然后我处理未来 findUserFuture.flatMap {....} .recover{...} 如果flatMap抛出异常,我假设将调用recover。但是如果findOne返回null,该怎么办?是否有Scala特定的方法来检查findUserFuture是否为null?如果(findUserFuture!=null)
未来
val findUserFuture: Future[Option[User]] = userRepo.findOne(userKeys)
然后我处理未来
findUserFuture.flatMap {....}
.recover{...}
如果
flatMap
抛出异常,我假设将调用recover
。但是如果findOne
返回null
,该怎么办?是否有Scala
特定的方法来检查findUserFuture
是否为null
?如果(findUserFuture!=null)
我可以假设做但是我想知道的是Scala
提供了一些不同的方法来检查null
s你也可以使用map
然后匹配结果
Example:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val findUserFuture: Future[Option[User]] = userRepo.findOne(userKeys)
findUserFuture.map {
case Some(v) => println(v) // Not Null...
case None => println(None) // None or Empty result..
}
Hope it helps.
Future
和Future
本身的结果以及null
和None
之间存在差异
null
是Java的遗留问题,通常不在Scala中使用。未来
本身可能是null
的唯一方法是如果findOne
返回null
,这是非常不可能的。因此,测试未来的
本身是没有用的
未来的结果是Option[User]
,因此flatMap
中的代码将给出一个Some(User)
或None
的值。您可以使用标准的选项
方法来测试此值。通常,您会对值进行匹配
,或者调用映射
来处理内容(如果存在)。有许多stackoverflow答案解释了如何安全地取消选中选项
值
请注意,选项[User]
的值可能是null
,但是,这不太可能,而且在库中可能是一个错误。如果findOne()
可能返回null
(真的?似乎有点可疑),那么您可以做的一件事是将null
转换为预期类型的实例
val findUserFuture: Future[Option[User]] = Option(userRepo.findOne(userKeys))
.getOrElse(Future(None))
…然后继续正常处理。不清楚您预期的是哪种情况Future
包含值null
或Future
本身是null
。如果findOne()
返回一个null
,然后映射它将抛出NPE。如果null
则可以使用case\u=>
更改case None=>
以处理与第一个不匹配的所有内容。情况并非如此null.map{…
将在计算任何案例之前抛出。但基本上它不会是null
,因为返回类型是Future[Option[User]]
,所以您可能会得到Future(Some(User(…))
或Future(None)
)试试这个:val findUserFuture:Future[Option[User]]=null
编译。现在map()
覆盖它。它也会编译,但不会运行。谢谢。我想您正在调用Option
的apply
伴随对象(apply[A](x:A):Option[A]
),它创建一些(x)
如果参数不为null,则为无
如果参数为null。-使用:Future.successful(None)
-无需异步计算None。