我有以下代码块。我的目的是使用方法params进行一些处理并返回Future[Int]
或fail
Future
。如果Future
中的方法参数类型为Future
,我想失败None
。我有以下代码。我想知道是否有更简洁和实用的方法来实现同样的目标。
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
失败。我可以如何增强上面的代码?
答案 0 :(得分:3)
如果您需要专门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
内抛出异常, map
绝对是多余的b / c,整个操作会导致失败Future
。对于大多数({1}}方法而言,这是正确的。
对于匹配,您可以使用Future
或opt.fold(throw ...)(...)
来避免它,但我认为这些选项的可读性较差。我建议只使用模式匹配函数定义来减少额外的代码