Как и этот вопрос класса класса, но с завихрением:
У меня есть класс case, который имеет некоторые глубоко вложенные классы case как свойства. В качестве простого примера,
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])
Я хотел бы объединить два класса case 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: в этом случае оба элемента существуют с некоторым (значением). Однако я хотел бы объединить свойства внутренней опции, а не просто переписать fb1 с новыми значениями fb2.
Мне интересно, есть ли хороший подход к объединению этих двух значений вместе таким образом, который требует минимального кода. Чувство моего чувства говорит мне попробовать использовать метод unapply
для класса case, чтобы вернуть кортеж, перебрать и комбинировать кортежи в новый кортеж, а затем применить кортеж к классу case.
Есть ли более эффективный способ сделать это?