以功能方式使用 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))
我有一个 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))