Groovy如何实现类似JavaScript的对象克隆并部分字段更新?
在Groovy中如何克隆对象并仅更新部分字段?
在JavaScript中,我们可以用扩展运算符轻松实现克隆对象并修改部分字段,示例代码如下:
const person = { isHuman: false, name: "gabe" }; const person2 = { ...person, name: 'alice' }
请问在Groovy中,是否存在无需手动复制所有字段的类似实现方式?我在编写测试用例时,希望每次仅修改一个属性来生成数据。
可行的实现方式
1. 针对Map:使用+运算符直接合并覆盖
如果你的数据是以Groovy Map形式存储的,直接用+运算符就能实现和JS扩展运算符完全一致的效果——合并两个Map,新Map中的字段会覆盖原Map的同名字段,且原Map不会被修改:
def person = [isHuman: false, name: 'gabe'] def person2 = person + [name: 'alice']
2. 针对普通Groovy对象:结合拷贝构造器与with方法
如果是自定义的Groovy类(建议加上@Canonical注解自动生成拷贝构造器),可以先通过拷贝构造器克隆原对象,再用with闭包修改指定属性:
@groovy.transform.Canonical class Person { boolean isHuman String name } def person = new Person(isHuman: false, name: 'gabe') def person2 = new Person(person).with { name = 'alice' it // 返回修改后的新对象 }
3. 针对不可变对象:使用自动生成的copyWith方法
如果你的类标记为不可变(用@Immutable注解),Groovy会自动为类生成copyWith方法,传入要修改的属性键值对即可得到全新的克隆对象:
@groovy.transform.Immutable class Person { boolean isHuman String name } def person = new Person(isHuman: false, name: 'gabe') def person2 = person.copyWith(name: 'alice')
内容的提问来源于stack exchange,提问作者freeza
相关产品推荐
相关产品推荐

