def foo(user, id): Future[Option[Bar]] =
bar(user, id).map(_.map(_.address.flatMap(_.street)))
.flatMap {
case Some(street) =>
baz(user, street).flatMap(_ => get(id))
case None => successful(None)
}
函数栏返回
Option[UserInfo]
,然后我将其映射到 UserInfo
. Address
也是Option
所以我 flatMap 可以访问 street
.然后,如果存在我想打电话的街道 baz
,如果不是,则 None
.忽略业务逻辑,为例子补上。这里的代码有问题,因为它无法编译。
Some(street)
是 Option
, 自 flatMap
第 3 行上的第一个 _
上的映射结果被调用, 而不是 _.address
.虽然我可以通过一些括号杂耍等来让它工作,但这段代码开始变得难以阅读和推理。
理解是答案吗?
P.S:这个例子中可能缺少一些类型信息,所以请询问,我会详细说明。
编辑:
case class UserInfo(id: UserId, address: Option[Address])
case class Address(street: Option[List[Street]], state: Option[State])
最佳答案
如果我正确理解方法签名:
def bar(user, id): Option[UserInfo]
def baz(user, List[Street]): Future[BarId]
def get(id): Option[Bar]
你可以实现你的方法是这样的:
val streetsOpt: Option[List[Street]] = bar(user, id).flatMap(_.flatMap(_.address.flatMap(_.street)))
streetsOpt.flatMap(streets => {
baz(user, streets).map(_ => get(id))
}).getOrElse(successful(None)))
关于scala - 以惯用方式链接 future 和期权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27479726/