i具有以下代码块。我的目的是使用方法参数进行一些处理,然后返回Future[Int]
或fail
Future
。如果我的论点对Future
中的方法是None
类型,我想让Future
失败。我有以下代码。我想知道是否有一种更简洁,实用的方法可以实现相同的方法。
def testoption(myFutOptInt: Future[Option[Int]]) = {
myFutOptInt.map { myOptInt =>
myOptInt match {
case None => throw new BadRequestException("Oh no.....") //Future.failed(BadRequestException(""))
case Some(myInt) => myInt + 45
}
} recoverWith {
case e:Exception => Future.failed(e)
}
}
- 我不喜欢我必须进行比赛的部分,想知道是否有一种方法可以做
map
或更好的事情并仍然实现。如果我做getOrElse
,我想如果值不是None
,我将无法编写业务逻辑?所以我认为getOrElse
是不可能的吗? - 我不喜欢此代码的另一件事是我正在抛出一个例外,然后我必须做
recoverWith
才能使Future
失败。
我可以增强上述代码如何?
如果您需要专门的BadRequestException
,则足够:
def testoption(myFutOptInt: Future[Option[Int]]) =
myFutOptInt.map {
case None => throw new BadRequestException("Oh no.....")
case Some(myInt) => myInt + 45
}
,如果您不关心特定的错误类型,则可以将其剪切更多:
def testoption(myFutOptInt: Future[Option[Int]]) = myFutOptInt.map(_.get + 45)
如果没有值,这将为您提供java.util.NoSuchElementException: None.get
recoverWith
绝对是冗余的b/c,如果在map
内抛出异常,则整个操作会导致Future
失败。对于大多数(如果不是全部),Future
方法是如此。
对于匹配,您可以使用opt.fold(throw ...)(...)
或.map(...).getOrElse(throw ...)
避免使用它,但我认为这些选项不那么可读。我建议仅使用模式匹配函数定义来减少额外的代码