La creación de una lista inmutable de una lista existente utilizando corrientes

Sara:

Hay una lista de Personobjetos.

List<Person> persons = generatePersons();

Un unmodifiableList se crea con ella.

List<Person> unmodifiableList = Collections.unmodifiableList(persons);

Entiendo que unmodifiableListno 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 personsy cuando se realizan cambios en la personslista, los cambios se reflejan en unmodifiableListdemasiado.

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 immutableListni ningún cambio en la lista original personsreflejarían al immutableList. Vamos a hacer una suposición de que Personlos 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 Personobjeto a la lista original personse impreso el tamaño de la personslista y unmodifiablePersons. Ambos me dan el mismo tamaño. Por lo tanto, los cambios se reflejan en unmodifiablePersonsy 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. unmodifiablePersonses de hecho una lista inmutable. Además, el nuevo Personse añadió objeto antes de que el unmodifiablePersonsfue creado y por lo tanto la observación anterior. Tonto estupendo.

Eugene:

Bien en su primer caso alguien tiene acceso a List<Person> unmodifiableList, y puede editarlo, pero cuando collectnadie tiene acceso a esa Listgenerada por Collectors.toList- por lo que es bueno.

Lo que probablemente se echa en falta es que Collectors::toListcreará 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::ofinternamente - colecciones inmutables añadidas en java-9, de este modo, por ejemplo, que no son compatibles con los nulos.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=137636&siteId=1
Recomendado
Clasificación