Twój kod można przełożyć na to:
def compute2(maybeFoo: Option[Foo]): Option[Int] =
for {
foo <- maybeFoo
bar <- foo.bar
baz <- bar.baz
} yield baz.compute
Cytaty z Programming in Scala, Second Edition:
Ogólnie, do ekspresji ma postać:
for (seq) yield expr
Tutaj , seq to sekwencja generatorów, d efinitions i filtry, z średnikami między kolejnymi elementami.
To dla ekspresji zawiera jeden generator, jedną definicję i jeden filtr:
for {
p <- persons // a generator
n = p.name // a definition
if (n startsWith "To") // a filter
} yield n
Tłumaczenie dla wyrazu z jednego generatora
Pierwszy, że masz prosty dla wyrażenia:
for (x <- expr1) yield expr2
gdzie x jest zmienną. Takie wyrażenie jest przetłumaczony na:
expr1.map(x => expr2)
Przełożenie dla wyrażeń wyjściowych z generatora oraz filtr
Teraz rozważenia dla wyrażeń, które łączą wiodącą generator z niektórych innych elementów. A dla wyrażeniem postaci:
for (x <- expr1 if expr2) yield expr3
są tłumaczone na:
expr1 withFilter (x => expr2) map (x => expr3)
Tłumaczenie dla wyrażenia zaczynające się od dwóch generatorów
Kolejna sprawa uchwyty do wyrażeń, które są uruchamiane z dwóch generatorów, w:
for (x <- expr1; y <- expr2) yield expr3
for wypowiedzi powyżej jest tłumaczony do stosowania flatMap:
expr1.flatMap(x => for (y <- expr2) yield expr3)
ok, myślę, że mam to w rzeczywistości, mam ten kawałek kodu działa teraz jak mój następny kawałek def simpleProgram: Przyszłość [ Int] = { dla { wyniku <- serviceCall() } yield result } –