首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将flatMap转换为for- Converting

将flatMap转换为for- Converting
EN

Stack Overflow用户
提问于 2014-04-25 21:51:58
回答 2查看 754关注 0票数 2

给定foobar

代码语言:javascript
复制
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

代码语言:javascript
复制
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时遇到了问题。

EN

回答 2

Stack Overflow用户

发布于 2014-04-26 10:20:50

for- followed只能是一系列flatMap调用,后跟一个map (或所有foreach调用)。对Try的调用打破了链条。您去掉了Try并使用了map,但是两个map调用也不能放在一个单独的for-can中。

Try.flatMap将捕获传递给flatMap的函数中出现的错误,因此我们可以通过对bar的结果调用get来简化返回类型

代码语言:javascript
复制
foo.map(a => a.map(c => bar(c).get))

我们可以通过像这样缩进其中的两个来获得非常接近的单个for-comprehension:

代码语言:javascript
复制
for {
  a <- foo
} yield for {
  c <- a
} yield bar(c).get

这会产生:

代码语言:javascript
复制
res12: scala.util.Try[Seq[String]] = Success(List(good, job))
票数 1
EN

Stack Overflow用户

发布于 2014-04-26 10:40:57

这一点:

代码语言:javascript
复制
foo.flatMap(a => Try(a.map(c => bar(c))))

等同于:

代码语言:javascript
复制
for {
  a <- foo
} yield a.map(c => bar(c))

至于“扁平”内部的map到相同的for-comprehension -如果你想要的结果是(即两个级别的Try)是没有意义的:

代码语言:javascript
复制
Success(List(Success(good), Success(job)))

尽管我的直觉告诉我你可能想要将List[Try[String]]展平为List[String] (例如使用.map(_.toOption).flatten),我猜wingedsubmariner也是这么建议的。

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

https://stackoverflow.com/questions/23295122

复制
相关文章

相似问题

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