您可以利用Try可以转换为Option和Option的事实Seq:
for {
list <- foo.toOption.toSeq // toSeq needed here, as otherwise Option.flatMap will be used, rather than Seq.flatMap
item <- list
result <- bar(item).toOption // toSeq not needed here (but allowed), as it is implicitly converted
} yield result
这将返回 a (可能为空,如果Trys 失败) Seq。
如果要保留所有异常详细信息,则需要一个Try[Seq[Try[String]]]. 这不能用单一的理解来完成,所以你最好坚持使用 plain map:
foo map {_ map bar}
如果你想以不同的方式混合你Try的 s 和Seqs ,事情会变得更复杂,因为没有自然的方法可以使 s 变平Try[Seq[Try[String]]]。@Yury 的回答展示了您必须做的事情。
或者,如果您只对代码的副作用感兴趣,您可以这样做:
for {
list <- foo
item <- list
result <- bar(item)
} result
这是有效的,因为foreach具有较少限制的类型签名。