2

我有一个函数(我删除了类型,因为我更关心如何将事物拼凑在一起):

def func(opt1: Option, opt2: Option) = Future {
  for {
    o1 <- opt1
    o2 <- opt2
  } functionThatReturnsAFuture(o1, o2)
  Future.successful()
}

我正在尝试验证选项,然后调用返回未来的函数,但我不知道如何在惯用的 scala 中执行此操作。

如果我这样做:

def func(opt1: Option, opt2: Option) = Future {
  for {
    o1 <- opt1
    o2 <- opt2
  } yield functionThatReturnsAFuture(o1, o2)
}

它自然会返回一个 Option[Future]。

我也可以这样做opt1.flatMap(opt2.map(functionThatReturnsAFuture)).sequence,但这仍然很丑陋。

是否有任何惯用的 scala(或 scala + 猫)方式进行这样的验证并返回 Future?

谢谢!

4

1 回答 1

2

你可以优雅地使用 Scala 解决这个问题。在任何情况下,您都需要处理其中一个选项没有或两个选项都没有的情况。

如果一个或两个值都没有,则返回失败的 Future。

case class NoneFoundException(msg: String) extends Exception(msg)

def func(opt1: Option, opt2: Option) = {
 val result = 
  for {
    value1 <- opt1
    value2 <- opt2
  } yield someFutureReturningFunction(value1, value2)

 result.getOrElse {
  Future.failed(NoneFoundException("one or both of opt1, opt2 are none."))
 }

}

使用类型而不是异常进行通信

sealed trait Result[+A]

case class ReturnedValue[+A](value: A) extends Result[A]

case class NoneFound extends Result[Nothing]

 def func(opt1: Option, opt2: Option) = {
  val result = 
   for {
     o1 <- opt1
     o2 <- opt2
   } functionThatReturnsAFuture(o1, o2).map(value => ReturnedValue(value))

  result.getOrElse {
   NoneFound
  }

}

现在函数的返回类型是 Future 而不是 Future 的 Option

于 2017-01-28T06:06:56.183 回答