给定foo和bar
scala> def foo: Try[Seq[String]] = Success(List("good", "job"))
foo: scala.util.Try[Seq[String]]
scala> def bar(x: String): Try[String] = Try(x)
bar: (x: String)scala.util.Try[String]如何将此flatMap转换为for-comprehension
scala> foo.flatMap(a => Try(a.map(c => bar(c))))
res48: scala.util.Try[Seq[scala.util.Try[String]]] =
Success(List(Success(good), Success(job)))请注意,我提供了上述代码作为对Using for-comprehension, Try and sequences in Scala的回答,但我在将其转换为for-comphension时遇到了问题。
发布于 2014-04-26 10:20:50
for- followed只能是一系列flatMap调用,后跟一个map (或所有foreach调用)。对Try的调用打破了链条。您去掉了Try并使用了map,但是两个map调用也不能放在一个单独的for-can中。
Try.flatMap将捕获传递给flatMap的函数中出现的错误,因此我们可以通过对bar的结果调用get来简化返回类型
foo.map(a => a.map(c => bar(c).get))我们可以通过像这样缩进其中的两个来获得非常接近的单个for-comprehension:
for {
a <- foo
} yield for {
c <- a
} yield bar(c).get这会产生:
res12: scala.util.Try[Seq[String]] = Success(List(good, job))发布于 2014-04-26 10:40:57
这一点:
foo.flatMap(a => Try(a.map(c => bar(c))))等同于:
for {
a <- foo
} yield a.map(c => bar(c))至于“扁平”内部的map到相同的for-comprehension -如果你想要的结果是(即两个级别的Try)是没有意义的:
Success(List(Success(good), Success(job)))尽管我的直觉告诉我你可能想要将List[Try[String]]展平为List[String] (例如使用.map(_.toOption).flatten),我猜wingedsubmariner也是这么建议的。
https://stackoverflow.com/questions/23295122
复制相似问题