以功能方式使用 Option 以避免 if-else

Using Option in functional way to avoid if-else

我有一个 Option 实例,比如说 O,它包含一个 class 的实例,比如说 A,A 本身里面有一些 Options。

我必须实现这样的东西,用伪代码表示为:

if(A.x exists) {
  if(A.y exists) {
   //extract values from some another Option Z embedded in A
  } else {
   // return Option of some default value
  }
}

所以我试试这个:

O.filter(some filter condition to have only some specific types of A).filter(!A.x.isEmpty).filter(!A.y.isEmpty).flatMap(_.z.somevalue).orElse(Some("Some default value"))

这是正确的方法吗,还是我需要在某些时候使用模式匹配?

编辑:结果应该是一个 Option[String].O si 一个 Option[A]。 A 是一个 class,包含字段 x、y、z,并且所有三个都是字符串的选项。

这看起来是 模式匹配 的一个很好的用例。

根据我对你的问题的理解,你想要这样的东西:
(如果没有,代码应该很容易调整)

final case class A(x: Option[String], x: Option[String], x: Option[String])

def getData(oa: Option[A]): Option[String] = oa match {
  case Some(A(Some(_), Some(_), z)) => z
  case None => None
  case _ => Some("Default Value")
}

最简洁的表达方式是

A.x.map(x => A.y.fold(default_value)(y => calculation_using_y))