2017-04-11 72 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方法變得非常麻煩。斯卡拉斯的鏡頭模式實施是一個很好的選擇。