在链式回调列表中返回第一个非null对象的优雅方法

时间:2018-01-15 13:13:07

标签: scala functional-programming

虽然仍然在Scala开始,但我偶然发现了一个功能算法问题。考虑以下表达式:

def myMethod(parentObject: ParentClass) : Option[Smtg] = {
  // Case 1
  parentObject.childObject.propertyObjectA.flatmap(_.propertychildA1)
  // Case 2
  parentObject.childObject.propertyObjectB.flatmap(_.propertychildB2)
  // Case 3
  parentObject.childObject.propertyObjectC.flatmap(_.propertychildC3)
}

如果不为空,我需要返回propertychildA1,否则propertychildB2如果不为空,则返回propertychildC3

以Scala的功能方式执行此操作的优雅方法是什么?

1 个答案:

答案 0 :(得分:2)

def myMethod(parentObject: ParentClass): Option[_] = {
  val childObject = parentObject.childObject
  lazy val a = childObject.propertyObjectA.flatMap(p => Option(p.propertychildA1))
  lazy val b = childObject.propertyObjectB.flatMap(p => Option(p.propertychildB2))
  lazy val c = childObject.propertyObjectC.flatMap(p => Option(p.propertychildC3))
  a orElse b orElse c
}

ofc你可以删除一些重复