2017-04-11 30 views
1

我想复制一个案例类,使用第二个案例类中的可选值更新案例类。具有可选值的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?如果可能的话,我想避免在Update范围内做出包含Some/None值的所有可能排列的匹配/大小写声明。

回答

2

简单:

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

所有情况下的类都具有复制方法。

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方法变得非常麻烦。斯卡拉斯的镜头模式实施是一个很好的选择。