只要返回Some,我就试图找到一种执行链接函数的正确方法。返回None应该停止进一步执行。我相信在每个函数内部都必须有一种无需检查的方法。一个简单的例子,我的意思是
def a(x: Int): Option[Int] = {
println(x)
Some(x+1)
}
def stop(x: Int): Option[Int] = {
println(x)
None
}
a(1)
.map(a)
.map(a)
.map(a)
.map(stop)
//Do not execute further
.map(a)
.map(a)
答案 0 :(得分:3)
使用flatMap
a(1)
.flatMap(a)
.flatMap(stop)
//Do not execute further
.flatMap(a)
.flatMap(a)
在此示例中,a
仅被调用两次。
答案 1 :(得分:2)
您可以使用for
以易于阅读的方式将map
和flatMap
的呼叫链接起来:
for {
a1 <- a(1)
a2 <- a(a1)
a3 <- stop(a2)
a4 <- a(a3)
a5 <- a(a4)
} yield a5
如果所有调用都返回Some
,则结果为Some(a5)
,但是如果任何调用返回了None
,则处理将停止,结果将为None
。因此,在这种情况下,它将在调用stop
之后停止并返回None
。
使用for
可以为中间结果使用一个有意义的名称,从而使代码更易于理解。