Scala 一个深藏在一系列条件句中的未来;否则";未来

Scala 一个深藏在一系列条件句中的未来;否则";未来,scala,akka,Scala,Akka,模式:未来深深地埋藏在一系列条件中(如果,映射,等等)。对于任何不满足此深层链的场景,都有一个“else”未来 为了说明这一点,我列举了两个例子 f具有分离的条件,因此需要多次指定“else”future(e): def f(uo: Option[User]): Future[String] = { val e = Future.successful("b") // note how `e` is specified twice below uo.map(u => if (u.

模式:
未来
深深地埋藏在一系列条件中(
如果
映射
,等等)。对于任何不满足此深层链的场景,都有一个“else”
未来

为了说明这一点,我列举了两个例子

f
具有分离的条件,因此需要多次指定“else”
future
e
):

def f(uo: Option[User]): Future[String] = {
  val e = Future.successful("b")
  // note how `e` is specified twice below
  uo.map(u => if (u.id != 123) Future.successful("a") else e).getOrElse(e)
}
g
中包含所有条件,因此“else”
future
只指定一次:

def g(uo: Option[User]): Future[String] = {
  val e = Future.successful("b")
  if (uo.isDefined && uo.get.id != 123) {
    Future.successful("a")
  } else e // note how the `e` is specified only once
}
我发现后者更好,可读性更好,尽管我对它不是100%满意,因为
uo.isDefined&&uo.get…
有点不太好第一个的
uo.map(u=>…
更清晰,但我对它不是100%满意,因为
e
被多次指定

对于更深层、更复杂的代码,必须进行大量解包以组合条件或必须到处重复相同的“else”有点烦人


问题:除了我上面给出的两种方法外,还有其他方法吗?

您可以经常使用模式匹配来折叠嵌套:

def f(uo: Option[User]): Future[String] = uo match {
    case Some(u) if u.id != 123 => Future.successful("a")
    case _ => Future.successful("e") //Will match for both None and Some(123), as desired
}
您可能还对该方法感兴趣,该方法接受要用作映射的分部函数,并为未定义的输入返回
None

def f(uo: Option[User]): Future[String] = uo.collect {
    case u if u.id != 123 => Future.successful("a")
}.getOrElse(Future.successful("e"))