scala – 用惯用的链接期货和期权
发布时间:2020-12-16 18:02:21 所属栏目:安全 来源:网络整理
导读: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],然后我将其映射
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))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |