You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:50:28