给定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]
如何将此平面地图
转换为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的答案,但在将其转换为进行编译时遇到了困难。
这:
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也在建议这样做。
你不能。一个用于理解的函数只能是一系列<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字符串或其他内容;直接转换的速度要快得多。