このケースクラスの質問に似ていますが、ひねりがあります:
プロパティとしていくつかの深くネストされたケース クラスを持つケース クラスがあります。簡単な例として、
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])
2 つの 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) と共に存在します。ただし、fb1 を fb2 の新しい値で上書きするだけでなく、内部オプション プロパティをマージしたいと考えています。
これらの 2 つの値を最小限のコードでマージする良い方法があるかどうか疑問に思っています。私の直感unapply
では、ケース クラスでメソッドを使用してタプルを返し、繰り返し処理してタプルを新しいタプルに結合し、そのタプルをケース クラスに適用し直すように指示されています。
これを行うためのより効率的な方法はありますか?