如何将这个地图/ flatMap转换成的理解,并请解释它是如何工作的,谢谢。
def compute2(maybeFoo: Option[Foo]): Option[Int] =
maybeFoo.flatMap { foo =>
foo.bar.flatMap { bar =>
bar.baz.map { baz =>
baz.compute
}
}
}
如何将这个地图/ flatMap转换成的理解,并请解释它是如何工作的,谢谢。
def compute2(maybeFoo: Option[Foo]): Option[Int] =
maybeFoo.flatMap { foo =>
foo.bar.flatMap { bar =>
bar.baz.map { baz =>
baz.compute
}
}
}
您的代码可以翻译成这样:
def compute2(maybeFoo: Option[Foo]): Option[Int] =
for {
foo <- maybeFoo
bar <- foo.bar
baz <- bar.baz
} yield baz.compute
从行情Scala中,第二版程序 :
一般地,用于表达的形式为:
for ( seq ) yield expr
这里,SEQ是发电机,定义,和过滤器的一个序列,在连续元件之间的分号。
这种用于表达包含一个发生器,一个定义,并且一个过滤器:
for {
p <- persons // a generator
n = p.name // a definition
if (n startsWith "To") // a filter
} yield n
翻译与一个生成器表达式
首先,假设你有表达一个简单的:
for (x <- expr1) yield expr2
其中x是一个变量。 这样的表达式翻译成:
expr1.map(x => expr2)
翻译开始用发电机和一个过滤器表达式
现在,考虑与其他一些元素结合的领先发电机表达式。 一种形式的表达:
for (x <- expr1 if expr2) yield expr3
被翻译成:
expr1 withFilter (x => expr2) map (x => expr3)
对于翻译起始两台发电机表达式
接下来的情况下,负责处理与两台发电机启动,作为表达式:
for (x <- expr1; y <- expr2) yield expr3
所述用于表达上述被转换为flatMap的应用:
expr1.flatMap(x => for (y <- expr2) yield expr3)