在理解中展开可选的播放路线参数

时间:2017-03-10 17:57:03

标签: scala functional-programming playframework-2.0 future for-comprehension

我有以下模式:

  1. 某些播放路线,其中定义了一些可选参数
  2.   

    GET / my / route controllers.something.Class.method(maybeA:Optional [Int],maybeB:Optional [Int])

    在方法中,我希望能够使用这些参数。我觉得我不明白使用的正确模式。我想做的是:

    blah match {
        case Some(someCase) => // do something
        case _ => for {
            a <- maybeA
            b <- maybeB
        } yield {
            somethingThatReturnsAFuture(a, b)
        }
    }
    

    问题在于for comprehension会返回Option[Future[Int]],但我需要它返回Future[Int]。我希望能够在理解结束时抛出一个get,但这闻起来很有趣(我实际上并不认为可以在get结束时抛出{{1}}。理解)。

    有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果某些内容为Option,那么直接处理此内容的结果也将为Option。摆脱Option的唯一方法是定义None案例。

val resultOpt: Option[Future[Int]] = blah match { ...
val result: Future[Int] = resultOpt match {
  case Some(f) => f
  case None => Future.successful(0)
}

或者只使用getOrElse。相同的代码,不同的风格:

val resultOpt: Option[Future[Int]] = blah match { ...
val result: Future[Int] = resultOpt.getOrElse(Future.successful(0))

关于这一点: http://alvinalexander.com/scala/how-to-use-multiple-options-for-loop-comprehension