scala - 以惯用方式链接 future 和期权

标签 scala coding-style future optional

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/

相关文章:

java - 如何捕获 CompletableFuture 的 whenCompleteAsync 调用中抛出的 RejectedExecutionException?

scala - Scala 可变集合的 View 有什么惰性?

scala - 在 scala 特征子类中创建时执行代码

python - 使用未知词典

c++ - 为什么 std::future<T> 和 std::shared_future<T> 不提供成员 swap()?

java - 在 future list 上流式传输的最有效方式

r - 如何计算残差的相关性? Spark-Scala

scala - 如何强制执行惰性值计算

Java 风格指南,为什么应该进行单个类导入?

java - Java中如何统一有效性检查和异常抛出?