在未来失败的支持下,从Future [Option [Int]]返回Future [Int]

时间:2017-09-24 17:35:25

标签: scala functional-programming scala-collections

我有以下代码块。我的目的是使用方法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失败。

我可以如何增强上面的代码?

1 个答案:

答案 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}}方法而言,这是正确的。

对于匹配,您可以使用Futureopt.fold(throw ...)(...)来避免它,但我认为这些选项的可读性较差。我建议只使用模式匹配函数定义来减少额外的代码