Considere este código
List<Employee> employees = new ArrayList<Employee>(); employees.add(new Employee("A", "B")); employees.add(new Employee("A1", "B1")); employees.stream().map(e-> { e.setfName("Mr. " + e.getfName()); return e; }); // 1. DOES NOT mutate employees' content employees.stream().map(e-> { e.setfName("Mr. " + e.getfName()); return e; }).collect(Collectors.toList()); // 2. DOES mutate employees' content employees.stream().map(e-> new Employee ("Mrs. " + e.getfName(), e.getlName())).collect(Collectors.toList()); // 3. DOES NOT put new objects in original listNo estoy seguro si entiendo la razón de este comportamiento. Si la transmisión crea una memoria separada, ¿no debería 2 NO mutar el contenido de la lista original?
employees.stream().map(e-> { e.setfName("Mr. " + e.getfName()); return e; }); // 1. DOES NOT mutate employees' contentLa línea 1 solo no muta el contenido de los empleados porque no hace nada en absoluto. Los flujos no se evalúan hasta que se llama a una operación de terminal.
La línea 2 crea una nueva lista para contener los empleados actualizados, pero los empleados originales están actualizados, por lo que tiene dos listas modificables de forma independiente que contienen exactamente los mismos empleados con exactamente los mismos datos donde no puede modificar uno sin el otro. Entonces, con el resultado de la línea 2, podría add nuevos objetos Employee y no modificar employees , pero no podría modificar los empleados en esa List sin modificar también los originales (porque son los mismos empleados).
Solo la Línea 3 crea nuevos objetos Employee que existen independientemente de los originales.
Una cosa importante que hay que entender acerca de los streams es que son perezosos . Si map los valores, la función de asignación solo se llama cuando recupera valores de la secuencia. collect un flujo es una forma de usar los valores y forzar las mutaciones, razón por la cual el segundo ejemplo muta la lista y el primero no. El tercer ejemplo no muta los objetos en su lugar, sino que crea un nuevo Employee para cada uno, por lo que crea una nueva lista clonada que no está relacionada con la lista original.