Bei einer @Value.Immutable
-annotated Klasse , die eine Sammlung von unveränderlichen Objekten enthält, was ist die eleganteste Art und Weise eine neue Kopie zu erstellen, in dem die untergeordneten Objekte geändert werden?
Um zum Beispiel ein Unternehmen mit Mitarbeitern gegeben, wenn ich alle Mitarbeiternamen festlegen möchten, in Großbuchstaben, dann ist dies der richtige Ansatz, oder gibt es eine einfachere?
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));
Dies wird ziemlich unleserlich in meinem realen Szenario, in dem die unbewegliche bearbeiteten drei Ebenen weg von den übergeordneten Knoten begraben wird (das Unternehmen), so dass ich versuche nur, um sicherzustellen, dass ich es nicht ein einfacher Ansatz ist, dass ich fehlt.