具有可选值的Scala案例类副本

时间:2017-04-11 18:00:55

标签: scala

我想制作一个案例类的副本,用第二个案例类中的可选值更新它。

case class A(
  id: Int,
  a: String,
  b: String,
  c: String)

case class Update(
  a: Option[String],
  b: Option[String],
  c: Option[String])

我可以复制A的最有效方式,使用Update中不是None的值更新字段?如果可能的话,我想避免在Some/None中制作涉及Update值的所有可能排列的匹配/案例陈述。

2 个答案:

答案 0 :(得分:5)

所有案例类都有复制方法。

http://docs.scala-lang.org/tutorials/tour/case-classes.html(找到复制条款)

val a = A(1, "", "", "")
val update = Update(None, "scalaz".some, None)
val b = a.copy(
  b = update.b.getOrElse(a.b)
)

还要检查镜头模式,以便以功能性方式复制深层嵌套对象:

http://eed3si9n.com/learning-scalaz/Lens.html

一旦有了由其他对象构成的对象等,使用copy方法就变得非常麻烦。 Scalaz的镜头模式实现是一个很好的选择。

答案 1 :(得分:3)

简单地:

val originalA: A = // ...
val update: Update = // ...
val newA: A = A(
  id = originalA.id,
  a = update.a.getOrElse(originalA.a),
  ...
)