在Scala中进行一系列flatMaps的惯用方法是什么?

Gre*_*ine 0 scala

我知道,将yield转换为一系列flatMaps,然后是最终地图.我发现自己经常希望它在最终的flatMap中结束.到目前为止,我的解决方法是进行收益率,然后进行平仓,如下所示:

val aOpt = Some("a")
val bOpt = Some("b")
def fakeComplexFunc(s1: String, s2: String): Option[String] = Some(s1 + s2)
(for {
    a <- aOpt
    b <- bOpt
} yield {
    // Pretend this is a long block with lots of stuff in it
    fakeComplexFunc(a, b)
}).flatten
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?对于像这样的案件,有什么最佳做法吗?如果我最终陷入这种境地,我是否做了一些彻底错误的事情?

Lee*_*Lee 5

你可以绑定结果fakeComplexFunc并产生它:

for {
  a <- aOpt
  b <- bOpt
  c <- fakeComplexFunc(a, b)
} yield c
Run Code Online (Sandbox Code Playgroud)

  • @bwawok - 是的,虽然那是因为monad一般不构成,但它并不是特别限制`for`理解. (2认同)