Hay una lista de Person
objetos.
List<Person> persons = generatePersons();
Un unmodifiableList se crea con ella.
List<Person> unmodifiableList = Collections.unmodifiableList(persons);
Entiendo que unmodifiableList
no es compatible con añadir / quitar / operaciones de conjuntos. Al mismo tiempo, no es inmutable, ya que tiene una referencia a una lista modificable existente persons
y cuando se realizan cambios en la persons
lista, los cambios se reflejan en unmodifiableList
demasiado.
Una lista inmutable se crea de esta manera.
List<Person> immutableList = Collections.unmodifiableList(new ArrayList<>(persons));
Esto crea una lista inmutable ya se está utilizando un constructor de conversión. Sin añadir / quitar / OPS establecidos se pueden realizar en immutableList
ni ningún cambio en la lista original persons
reflejarían al immutableList
. Vamos a hacer una suposición de que Person
los objetos son inmutables también.
Ahora, quiero crear estas dos listas que utilizan corrientes.
La primera de ellas, que he creado usando:
List<Person> unmodifiablePersons = persons.stream() .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
Estoy perdido en la creación de equivalente de immutableList a través de arroyos.
¿Cómo puedo hacer eso?
Editar:
He añadido un nuevo Person
objeto a la lista original persons
e impreso el tamaño de la persons
lista y unmodifiablePersons
. Ambos me dan el mismo tamaño. Por lo tanto, los cambios se reflejan en unmodifiablePersons
y por lo tanto no es inmutable todavía. ¿Me estoy perdiendo de algo?
Editar 2
Tonto. Debería haber ido a través de los documentos. unmodifiablePersons
es de hecho una lista inmutable. Además, el nuevo Person
se añadió objeto antes de que el unmodifiablePersons
fue creado y por lo tanto la observación anterior. Tonto estupendo.
Bien en su primer caso alguien tiene acceso a List<Person> unmodifiableList
, y puede editarlo, pero cuando collect
nadie tiene acceso a esa List
generada por Collectors.toList
- por lo que es bueno.
Lo que probablemente se echa en falta es que Collectors::toList
creará una nueva lista - que en realidad debería ser obvio; y envolverlo en un uno no se puede modificar, por lo tanto el resultado de que es verdaderamente no se puede modificar.
También en java-10 existe colector especial para que:
List<Integer> result = Arrays.asList(1, 2, 3, 4)
.stream()
.collect(Collectors.toUnmodifiableList());
Este colector utiliza List::of
internamente - colecciones inmutables añadidas en java-9, de este modo, por ejemplo, que no son compatibles con los nulos.