【问题标题】:Using Option in functional way to avoid if-else以功能方式使用 Option 来避免 if-else
【发布时间】:2021-03-29 14:11:23
【问题描述】:

我有一个 Option 实例,比如说 O,它包含一个类的实例,比如说 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 an Option[A]。 A是一个有x,y,z字段的类,三个都是String的Option。

【问题讨论】:

  • 如果您能提供这些类型的示例定义,会更容易提供帮助;也不清楚最终结果应该是什么。
  • 宁可使用Option 组合子或模式匹配;例如(for { x <- A.x; y <- A.y } yield somethingWith(x, y)).getOrElse(defaultValue)

标签: scala option


【解决方案1】:

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

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

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")
}

【讨论】:

    【解决方案2】:

    最简洁的表达方式是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      相关资源
      最近更新 更多