scala – 用惯用的链接期货和期权

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.地址也是一个选项,所以我flatMap可以访问街道.然后,如果有一条街道,我想打电话给巴兹,如果没有,那么无.忽略业务逻辑,它就是为了这个例子.

这里的代码存在问题,因为它无法编译.

一些(街道)是一个选项,因为第3行上的flatMap是在第一个_而不是_.address上的映射结果上调用的.

虽然我可以通过一些括号杂耍等来使用它,但这段代码开始变得难以阅读和推理.

理解是答案吗?

P.S:这个例子中可能缺少某些类型信息,所以请问,我会详细说明.

编辑:

case class UserInfo(id:UserId,address:Option [Address])

案例类地址(街道:选项[列表[街道]],州:选项[州])

解决方法

如果我理解方法签名是正确的:

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

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...