我想制作一个案例类的副本,用第二个案例类中的可选值更新它。
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
值的所有可能排列的匹配/案例陈述。
答案 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),
...
)