如何在scala中的对象中复制包装在选项中的对象

如何在scala中的对象中复制包装在选项中的对象,scala,Scala,我在Scala中有以下结构- case class SomeObject (name: String, anotherObject: Option[AnotherObject]) case class AnotherObject (value1: Array[String], value2: String, value3: String) 现在我想复制SomeObject,它已经被实例化,如下所示 SomeObject.copy(anotherObject = SomeObject.anoth

我在Scala中有以下结构-

case class SomeObject (name: String, anotherObject: Option[AnotherObject])
case class AnotherObject (value1: Array[String], value2: String, value3: String)
现在我想复制SomeObject,它已经被实例化,如下所示

SomeObject.copy(anotherObject = SomeObject.anotherObject.copy
                                (value3 = <SomeAnotherValue>))
SomeObject.copy(anotherObject=SomeObject.anotherObject.copy
(值3=))

这不起作用,请建议可能的解决方案。

我认为,问题在于选项没有
复制
方法,而您希望调用另一个对象
复制
方法

假设您只想更改内部值,如果您的变量存在(意味着它是一个Some),那么您可以
映射
选项,以获取另一个对象实例。
为了使多个调用更简单,我在SomeObject类中创建了一个aux方法来封装逻辑

final case class AnotherObject(value1: Array[String], value2: String, value3: String)
final case class SomeObject(name: String, anotherObject: Option[AnotherObject]) {
  def changeInnerValue3(newValue: String): SomeObject =
    this.copy(
      anotherObject = this.anotherObject.map(ao => ao.copy(value3 = newValue))
    )
}

SomeObject(name = "so", anotherObject = Some(AnotherObject(value1 = Array.empty, value2 = "Hello", value3 = "World!")))
// res1: SomeObject = SomeObject(so,Some(AnotherObject([Ljava.lang.String;@52bba91a,Hello,World!)))

res1.changeInnerValue3(newValue = "You")
// res2: SomeObject = SomeObject(so,Some(AnotherObject([Ljava.lang.String;@52bba91a,Hello,You)))

我认为,问题在于选项没有
复制
方法,而您希望调用另一个对象
复制
方法

假设您只想更改内部值,如果您的变量存在(意味着它是一个Some),那么您可以
映射
选项,以获取另一个对象实例。
为了使多个调用更简单,我在SomeObject类中创建了一个aux方法来封装逻辑

final case class AnotherObject(value1: Array[String], value2: String, value3: String)
final case class SomeObject(name: String, anotherObject: Option[AnotherObject]) {
  def changeInnerValue3(newValue: String): SomeObject =
    this.copy(
      anotherObject = this.anotherObject.map(ao => ao.copy(value3 = newValue))
    )
}

SomeObject(name = "so", anotherObject = Some(AnotherObject(value1 = Array.empty, value2 = "Hello", value3 = "World!")))
// res1: SomeObject = SomeObject(so,Some(AnotherObject([Ljava.lang.String;@52bba91a,Hello,World!)))

res1.changeInnerValue3(newValue = "You")
// res2: SomeObject = SomeObject(so,Some(AnotherObject([Ljava.lang.String;@52bba91a,Hello,You)))

您只需在
选项
内的对象上调用
复制
,而不是在
选项
本身上,使用
映射

SomeObject.copy(anotherObject = SomeObject.anotherObject.map(_.copy
                            (value3 = <SomeAnotherValue>)))
SomeObject.copy(anotherObject=SomeObject.anotherObject.map(\ux.copy
(值3=))

您只需使用
映射对
选项
内的对象调用
复制
,而不是
选项
本身:

SomeObject.copy(anotherObject = SomeObject.anotherObject.map(_.copy
                            (value3 = <SomeAnotherValue>)))
SomeObject.copy(anotherObject=SomeObject.anotherObject.map(\ux.copy
(值3=))

嗯,
另一个对象
是一个选项,它没有
复制
方法。我认为您需要更改内部值(假设
另一个对象
也是
case类
),前提是
另一个对象
存在(意味着它是
某个[另一个对象]
),如果它不存在(意味着它是
),则保留它。或者,如果它是
,是否要提供默认值?好的,
另一个对象
是一个选项,它没有
复制
方法。我认为您需要更改内部值(假设
另一个对象
也是
case类
),前提是
另一个对象
存在(意味着它是
某个[另一个对象]
),如果它不存在(意味着它是
),则保留它。或者,如果它是一个
None
,您想提供一个默认值吗?这看起来像是我问题的解决方案,但是我想使用copy方法和map方法。@ChandramohanSawant这就是我所做的,不是吗?你的确切意思是什么?这看起来像是我问题的解决方案,但我一直在寻找使用复制方法和映射方法。@ChandramohanSawant这就是我所做的,不是吗?你到底是什么意思?