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"))