如何编辑Java“Immutables”对象副本中的子集合?

如何编辑Java“Immutables”对象副本中的子集合?,java,immutables-library,Java,Immutables Library,给定一个包含不可变对象集合的@Value.Immutable-注释类,在其中修改子对象时,创建新副本的最优雅方式是什么 例如,给定一家有员工的公司,如果我想将所有员工姓名设置为大写,这是正确的方法,还是有更简单的方法 Company c1 = ImmutableCompany.builder() .name("ACME") .addEmployees( ImmutableEmployee.builder().name("William Shakespeare").

给定一个包含不可变对象集合的
@Value.Immutable
-注释类,在其中修改子对象时,创建新副本的最优雅方式是什么

例如,给定一家有员工的公司,如果我想将所有员工姓名设置为大写,这是正确的方法,还是有更简单的方法

Company c1 = ImmutableCompany.builder()
    .name("ACME")
    .addEmployees(
        ImmutableEmployee.builder().name("William Shakespeare").build(),
        ImmutableEmployee.builder().name("T.S. Eliot").build()
    )
    .build();

Company c2 = ImmutableCompany.copyOf(c1).withEmployees(
    c1.employees().stream().map(employee ->
        ImmutableEmployee.copyOf(employee).withName(employee.name().toUpperCase())).collect(Collectors.toList())
);

assertThat(c2.employees().get(0).name(), equalTo("WILLIAM SHAKESPEARE"));
assertThat(c2.employees().get(1).name(), equalTo("T.S. ELIOT"));

这在我的真实场景中变得相当难以理解,其中正在编辑的属性被掩埋在距离父节点(公司)三层的地方,因此我只是想确保我没有缺少一个更简单的方法。

什么将
copyOf
返回?构建器还是对象本身?返回对象本身(
ImmutableCompany
ImmutableEmployee
)。这样会更好吗<代码>ImmutableCompany.builder().name(c1.getName()).addEmployees(c1.employees().stream().map(employee->ImmutableEmployee.builder().name(employee.name().toUpperCase()).collect(Collectors.toList())不幸的是,情况更糟,因为这样,我必须按名称将每个属性从c1显式复制到c2,而不是复制所有属性的单个
copyOf
调用。在这个玩具的例子中,只有一个属性可以复制,但在现实生活中,会有更多。