如何在scala中的对象中复制包装在选项中的对象
我在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
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这就是我所做的,不是吗?你到底是什么意思?