您可以利用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 (可能为空,如果Try
s 失败) Seq
。
如果要保留所有异常详细信息,则需要一个Try[Seq[Try[String]]]
. 这不能用单一的理解来完成,所以你最好坚持使用 plain map
:
foo map {_ map bar}
如果你想以不同的方式混合你Try
的 s 和Seq
s ,事情会变得更复杂,因为没有自然的方法可以使 s 变平Try[Seq[Try[String]]]
。@Yury 的回答展示了您必须做的事情。
或者,如果您只对代码的副作用感兴趣,您可以这样做:
for {
list <- foo
item <- list
result <- bar(item)
} result
这是有效的,因为foreach
具有较少限制的类型签名。