首页 > 解决方案 > 如何在 Java `Immutables` 对象的副本中编辑子集合?

问题描述

给定一个@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"));

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

标签: javaimmutables-library

解决方案


推荐阅读