首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >How do I to flatMap a Try[Option] in a flatMap way?

How do I to flatMap a Try[Option] in a flatMap way?
EN

Stack Overflow用户
提问于 2017-12-13 22:38:18
回答 0查看 408关注 0票数 4

我想要使用某个函数来flatMap一个Try[OptionA],该函数使用选项内的值来创建另一个Try,并且我希望解决方案简单且惯用。我已经用一个例子说明了这个问题。目标是创建一个OptionGroup,将成员和事件包装在一个Try中,该Try可以包含来自这三个函数中的任何一个函数的错误。

代码语言:javascript
复制
def getGroup(id: Long): Try[Option[Group]]

def getMembersForGroup(groupId: Long): Try[Seq[Member]]

def getMeetingsForGroup(groupId: Long): Try[Seq[Meeting]]

我发现很难从getGroup返回的flatMap到成员函数和会议函数的Try,因为有一个选项“挡路”。这就是我到目前为止想出的:

代码语言:javascript
复制
getGroup(id).flatMap(
  groupOpt => groupOpt.map(
    group => addStuff(group).map(group => Some(group))
  ).getOrElse(Success(None))
)

def addStuff(g: Group): Try[Group] =
  for {
    members <- getMembersForGroup(g.id)
    meetings <- getMeetingsForGroup(g.id)
  } yield g.copy(members = members, meetings = meetings)

我不喜欢我的解决方案的一个地方是,我必须将addStuff返回的组包装在一个选项中以执行getOrElse。在这一点上,类型是Option[Try[OptionGroup]],我认为这使得解决方案乍一看很难理解。

这个问题有没有更简单的解决方案?

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47795621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档