当前位置: 首页 > 知识库问答 >
问题:

转换平面图到理解

壤驷泓
2023-03-14

给定foobar

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]

如何将此平面地图转换为for-理解

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)))

请注意,我提供了上述内容,作为在Scala中使用for constancement、Try和sequences的答案,但在将其转换为进行编译时遇到了困难。


共有2个答案

罗毅
2023-03-14

这:

foo.flatMap(a => Try(a.map(c => bar(c))))

等效于:

for {
  a <- foo
} yield a.map(c => bar(c))

至于将内部映射“扁平化”相同的理解 - 如果你希望结果是没有意义的(即2级Try):

Success(List(Success(good), Success(job)))

虽然我的直觉告诉我,你可能想把List[Try[String]]扁平化为List[String](使用例如.map(_.toOption).flatten),我猜wingedsubmariner也在建议这样做。

施招
2023-03-14

你不能。一个用于理解的函数只能是一系列<code>平面映射</code>调用,然后是一个<code>映射</code>(或所有<code>foreach</code>调用)。调用<code>Try</code>会打破链条。您可以去掉Try并使用map,但是两个map调用也不能成为一个单独的调用来理解。

Try.flatMap将捕获传递给(平面图)的函数中发生的错误,因此我们可以通过在bar的结果上调用get来简化返回类型:

foo.map(a => a.map(c => bar(c).get))

我们可以通过缩进其中两个来非常接近一个用于理解,如下所示:

for {
  a <- foo
} yield for {
  c <- a
} yield bar(c).get

它产生:

res12: scala.util.Try[Seq[String]] = Success(List(good, job))
 类似资料:
  • 我似乎真的不了解Map和FlatMap。我无法理解的是,for-comprehensiion是如何对map和flatMap的一系列嵌套调用的。以下示例来自 Scala 中的函数式编程 转化为 mkMatcher方法定义如下: 图案方法如下: 如果有人能在这里阐明使用map和flatMap背后的基本原理,那就太好了。

  • 如何将此地图/平面图转换为便于理解的图形,请解释其工作原理,谢谢。

  • 所以目前我看到的是这样的: 这是我目前编写的Jolt规范(编辑): 以及转换后的输出: 任何帮助都是非常感谢的。

  • 对于理解Scala中的以下代码段,什么是最好的(无需线性/回调、较少样板)形式?

  • 问题内容: 如何转换 为? 这不起作用: 问题答案: 如果您只包含,则可以这样操作: 如果不是,则可以替换 为。

  • 问题内容: 我一直在研究Jackson,但似乎我必须将Map转换为JSON,然后将所得的JSON转换为POJO。 有没有一种方法可以将Map直接转换为POJO? 问题答案: 好吧,您也可以使用Jackson来实现。(由于您正在考虑使用杰克逊,因此似乎更舒适)。 使用的方法: 无需转换为JSON字符串或其他内容;直接转换的速度要快得多。