我想要使用某个函数来flatMap一个Try[OptionA],该函数使用选项内的值来创建另一个Try,并且我希望解决方案简单且惯用。我已经用一个例子说明了这个问题。目标是创建一个OptionGroup,将成员和事件包装在一个Try中,该Try可以包含来自这三个函数中的任何一个函数的错误。
def getGroup(id: Long): Try[Option[Group]]
def getMembersForGroup(groupId: Long): Try[Seq[Member]]
def getMeetingsForGroup(groupId: Long): Try[Seq[Meeting]]我发现很难从getGroup返回的flatMap到成员函数和会议函数的Try,因为有一个选项“挡路”。这就是我到目前为止想出的:
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]],我认为这使得解决方案乍一看很难理解。
这个问题有没有更简单的解决方案?
https://stackoverflow.com/questions/47795621
复制相似问题