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

带有可选值的Scala案例类副本,scala,Scala,我想复制一个case类,用第二个case类的可选值更新它 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的值更新字段的最有效方法是什么?如果可能的话,我希望避免在Update中使用包含所有可能的Some/Non

我想复制一个case类,用第二个case类的可选值更新它

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
的值更新字段的最有效方法是什么?如果可能的话,我希望避免在
Update
中使用包含所有可能的
Some/None
值排列的match/case语句

简单地说:

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

所有case类都有一个copy方法

(查找复制术语)

还可以查看透镜图案,以便以功能性方式复制深度嵌套的对象:

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

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