类似于这个案例类问题,但有一个转折:
我有一个案例类,它有一些深度嵌套的案例类作为属性。举个简单的例子,
case class Foo(fooPropA:Option[String], fooPropB:Option[Int])
case class Bar(barPropA:String, barPropB:Int)
case class FooBar(name:Option[String], foo:Foo, optionFoo: Option[Foo], bar:Option[Bar])
我想将两个 FooBar 案例类合并在一起,获取输入存在的值并将它们应用于现有实例,生成更新版本:
val fb1 = FooBar(Some("one"), Foo(Some("propA"), None), Some(Foo(Some("propA"), Some(3))), Some(Bar("propA", 4)))
val fb2 = FooBar(None, Foo(Some("updated"), Some(2)), Some(Foo(Some("baz"), None)), None)
val merged = fb1.merge(fb2)
//merged = FooBar(Some("one"), Foo(Some("updated"), Some(2)), Some(Foo(Some("baz"), Some(3))), Some(Bar("propA", 4)))
我知道我可以使用镜头来组成深度嵌套的属性更新;但是,我觉得这需要大量的样板代码:我需要为每个属性使用一个镜头,并且在父类中需要另一个组合镜头。这似乎需要维护很多东西,即使在shapeless中使用更简洁的镜头创建方法也是如此。
棘手的部分是 optionFoo 元素:在这种情况下,两个元素都以 Some(value) 存在。但是,我想合并内部选项属性,而不仅仅是用 fb2 的新值覆盖 fb1。
我想知道是否有一种好的方法可以以需要最少代码的方式将这两个值合并在一起。我的直觉告诉我尝试使用unapply
案例类上的方法返回一个元组,迭代并将元组组合成一个新的元组,然后将元组应用回一个案例类。
有没有更有效的方法来做到这一点?