scala - 我如何在 Scala 中拆分充满选项的案例类

标签 scala option case-class

我对 Scala 很陌生,我仍在努力习惯它的语法和风格,所以这可能是一个非常简单的问题。

我正在使用一个代码库,其中有很多使用选项填充的案例类,如下所示:

case class Person(
  pants: Option[Pants]
)
case class Pants(
  pocket: Option[Pocket]
)
case class Pocket(
  cash: Option[Cash]
)
case class Cash(
  value: String = "zilch"
)

在上面的示例中,您将如何返回 Person 中的金额。的 Pants Pocket ,如果他们真的穿着裤子……有口袋,他们有没有钱?

最佳答案

Scalaz 7 发生了一些变化,所以这里是另一个例子:

  object PartialLensExample extends App {

  import scalaz._
  import Lens._
  import PLens._


  case class Bar(blub: Option[String])
  case class Foo(bar: Option[Bar])

  // normal lenses for getting and setting values
  val fooBarL: Foo @> Option[Bar] = lensg(foo ⇒ bar ⇒ foo.copy(bar = bar), _.bar)
  val barBlubL: Bar @> Option[String] = lensg(bar ⇒ blub ⇒ bar.copy(blub = blub), _.blub)

  // compose the above as 'Partial Lenses', >=> is just an alias for 'andThen'
  val fooBarBlubL: Foo @?> String = fooBarL.partial >=> somePLens >=> barBlubL.partial >=> somePLens

  // try it
  val foo = Foo(Some(Bar(Some("Hi"))))

  println(fooBarBlubL.get(foo)) // Some(Hi)

  println(fooBarBlubL.set(foo, "Bye")) //Foo(Some(Bar(Some(Bye))))

  // setting values
  val foo2 = Foo(None)
  println(fooBarL.set(foo2, Some(Bar(None)))) // Foo(Some(Bar(None)))

}

关于scala - 我如何在 Scala 中拆分充满选项的案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8943943/

相关文章:

scala - Spark MergeSchema 在 Parquet 列上

graph - float 图表标题选项?

java - 如何将环境变量传递给jar文件?

'auto-closed' 括号的 Vim 插件?

parsing - 轻松将 Key=Value 对的字符串解析为 Scala 案例类

scala - 为什么私有(private)构造函数在案例类中仍然可见?

Scala 前向引用

scala - Play 2.0.1 - Scala 模板字符串连接 + 可重用代码块

java - 在 Scala 中实现多级 Java 接口(interface)

parsing - Scala中Regex Parsers,Standard TokenParsers和JavaTokenParsers之间的区别