当某些没有显式检查时,Scala链接功能

时间:2018-12-12 08:26:53

标签: scala functional-programming

只要返回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)

2 个答案:

答案 0 :(得分:3)

使用flatMap

a(1)
.flatMap(a)
.flatMap(stop)
//Do not execute further
.flatMap(a)
.flatMap(a)

在此示例中,a仅被调用两次。

答案 1 :(得分:2)

您可以使用for以易于阅读的方式将mapflatMap的呼叫链接起来:

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可以为中间结果使用一个有意义的名称,从而使代码更易于理解。