从未来[option [int]]中返回未来的未来,以支持未来



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 ...)避免使用它,但我认为这些选项不那么可读。我建议仅使用模式匹配函数定义来减少额外的代码

相关内容

最新更新