您的代码可以被转换成这样:
def compute2(maybeFoo: Option[Foo]): Option[Int] =
for {
foo <- maybeFoo
bar <- foo.bar
baz <- bar.baz
} yield baz.compute
行情从Programming in Scala, Second Edition:
通常,用于表达的形式为:
for (seq) yield expr
这里,seq是一系列发生器,d定义和过滤器,在连续元素之间使用分号。
这对表达式包含一台发电机,一个定义,一个过滤器:
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)
好吧,我想我明白了,事实上,我得到了一段代码作为我的下一块高清simpleProgram工作现在还有:未来[ Int] = { 针对{ 结果<-serviceCall() }产生结果 } –